安卓原生APP中经常会内嵌个H5页面,这就需要用到WebView。很多人对WebView的使用不以为然,
觉得也就那么回事,但实际上关于WebView我们能聊得有很多...
首先我们聊聊他的出生,众所周知,因为爸爸都是谷歌公司,WebView和Chrome浏览器有着紧密的关系。
他们实际上都是谷歌Chromium Project下的顶级项目,链接:chromium project,他们的身上流着
相似的血液,不同的是:
1. Chrome浏览器是多进程架构(内存换速度),WebView 是单进程架构。
2. Chrome浏览器内存占用比 WebView大的多。
3. Chrome支持更多的HTML5 特性。
The Chromium Project 不同内核的Webview差异(Android4.4后改用Chrome内核)知道了webview的前世,就更有利于去使用他了。下面来聊聊他的今生
一个网页的加载和渲染涉及到的流程很多,很多是我们android端没法处理的,那么从android开发的角度,
当我们使用Webview去加载网页的时候,该注意哪些呢?或者说有哪些地方可以提高?来看看下面的几点:
1.缓存
预加载、预缓存 可以让加载速度的瓶颈更小,网页加载速度更快, 这就涉及到Webview的缓存机制:
Android WebView 自带的缓存模式有5种:
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
LOAD_CACHE_NORMAL: 已经废弃(同LOAD_DEFAULT),
使用方式:
WebView.getSettings().setCacheMode(WebSettings.XXX);
使用缓存后,一个是刷新机制,一个是流量的问题,这两个都需要格外注意。
2.硬件加速
这里的硬件加速实际上并非单指性能,有很多高级特效需要硬件加速的支持,比如一些3D画面
当觉得网页卡顿或者不显示时,可以尝试打开
有四个级别:
(1).应用级,需要在清单文件中设置
<application
android:hardwareAccelerated="true">
(2).Activity级
<activity android:name=".TestActivity"
android:hardwareAccelerated="false">
</activity>
(3).Window级别
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
(3).View级别
view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
3.使用更高版本的浏览器内核(系统层面,需要会framework)
低版本的浏览器不仅性能低下,而且对新语法支持不佳,
一些旧的内核可能要在html中增加'use strict'(严苛模式)这句话才能支持一些新的语法。
那么如何查看当前系统内核版本呢?
有很多方法,可以直接访问工具类网站,如
http://www.thismachine.info/(国外)
https://liulanmi.com/labs/core.html(国内),也可以直接在开发者工具里输入navigator.userAgent查看,
如果可以更新的话,最好还是更新到最新的版本。
4.三方浏览器sdk
更新系统浏览器内核限制诸多,这时就要依靠第三方的浏览器sdk了,这方面选择不多,
国内的腾讯X5,国外的Crosswalk。个人建议用X5即可,毕竟国内的文档全些。要注意的是
即使引用了X5的jar包,也并不代表就成功开启了X5内核,它还要去下载一个内核才可以。
并且会涉及到32位,64位等一些兼容性问题,在一些小众的芯片上甚至会奔溃。
具体的参考官方文档吧。
5.内存泄漏
关于泄漏的有很多文章都已经写了,这里不做详细阐述了,基本上有这么2个点:
(1).初始化用new的方式add到父容器里
(2).退出时及时销毁
public void destory() {
if (mWebView != null) {
Log.d(TAG, "WebView destory");
mWebView.stopLoading();
mWebView.clearHistory();
mWebView.removeAllViews();
mWebView.destroy();
mWebView = null;
}
}
另外,我想补充一点的是,上面的方式是避免webview控件使用不当造成的泄漏,
但如果是webview里的内容造成了泄漏怎么办?
首先,不管是哪种泄漏,我们都应该对应用(webview)进行内存的监控(AS用Profiler查看),
在PC端,可以用任务管理器查看,通过频繁、持续的操作看看内存会不会增长。
任务管理器可以查看每个tab页占用的内存大小使用开发者工具中的Memory还可以定位到对象的内存,更加方便我们查找内存泄漏的源头
其原理是通过两次内存快照(snapshot),然后做差比较(comparison),得出新增长的内存对象。
这里的列表是将内存大小从大到小排列,如果存在内存泄漏,那么要先从排列在前几位的下手6.调试
Android端的webview很难调试,因为无法使用开发者工具(Developer Tool)控制台,谷歌浏览器可以支持远程调试,网上也有很多教程了,并不复杂。
备注:
1.有时候会有清晰度的问题,要小心这两个方法的使用:
自适应大小开启后可能会导致web页面元素缩放造成模糊现象
webSetting.setUseWideViewPort(true);
webSetting.setLoadWithOverviewMode(true);
2.Webview性能的量化(不服跑个分)
http://html5test.com/(不只是性能分数,还有N项详细指标,就是外网比较慢)
html5test,WebView的"体检官"安兔兔测试:
好了,到这里,webview的前世今生就聊得差不多了,大家有收获吗?
网友评论