随着app的迭代,嵌入的html5界面越来越多了,WebView这个强大组件引起的问题越发的多起来,实际使用就需要对其做些优化。
使用WebView的过程中主要碰到的问题是:
- WebView导致的oom问题
- Android版本不同,采用了不同的内核,兼容性crash
- 不同版本实现不同,甚至URI不规范也会引起不同程度的问题
OOM及导致的卡顿基本是因为其占用的内存太大,可以参考微信的做法将webview放在一个单独的进程中(架构案例丨微信Android客户端架构演进之路),这样的好处有:
- 有效增大App的运存,减少由webview引起的内存泄露对主进程内存的占用。
- 避免WebView的Crash影响App主进程的运行。
- 拥有对WebView独立进程操控权。
WebView进程与其他进程通讯的方式,把webview独立进程之后会发现,埋点功能和接收主进程数据都不正常了,这里就涉及到进程间通讯的问题了;进程通讯无非就是那几种,aidl,messager,content provider,广播;基本采用广播的方式是比较简单和合适的。
WebView硬件加速导致页面渲染闪烁
4.0以上的系统我们开启硬件加速后,WebView渲染页面更加快速,拖动也更加顺滑。但有个副作用就是,当WebView视图被整体遮住一块,然后突然恢复时(比如使用SlideMenu将WebView从侧边滑出来时),这个过渡期会出现白块同时界面闪烁。解决这个问题的方法是在过渡期前将WebView的硬件加速临时关闭,过渡期后再开启,代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
html5跳原生界面
网页跳原生界面的方法有很多种,比如js调java方法,或者JSBridge,或者是通过uri scheme啦,也可以通过自己解析url来做。通过重写WebViewClient
的shouldOverrideUrlLoading
方法来进行拦截将要加载的URL.
关于addJavascriptInterface在4.2版本以下的设备会出现的问题,参考 http://drops.wooyun.org/papers/548,可以选择使用JsBridge。
WebView缓存
可以通过使用缓存来减少网络请求,从而加快网页的响应。
1)优先使用缓存:webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK)
;
2)不使用缓存:webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE)
;