在页面打开前,Native需要花费一定时间准备WebView,之后才会进入DNS寻址等处理。
APP冷启动后首次创建Webview耗时较长(经测试300ms),但二次创建(打开H5页面后,退出H5,再重新打开H5时创建Webview)的耗时要大大缩短,大概20ms。即WebView的初始化耗时还是比较长的,但初始化一次后,第二次初始化会快很多。
所以常见优化方案分两步:
第一步:Webview预加载。App启动就初始化一次WebView。副作用是WebView的初始化必须位于主线程,但主线程会阻塞其他业务代码导致ANR
public class App extends Application { @Override public void onCreate() { ... WebView webView = new WebView(this); // 无脑初始化一次Webview webView.destroy(); webView = null; } }
第二步:WebView池。在首次后台创建WebView后并不销毁,而是存入备用池,当用户需要时直接取出来使用,这样可以将WebView初始化时间降到几乎为0。
副作用是内存占用上,首个WebView会占用十几兆内存,非首个WebView内存占用0.2M左右内存。另外Android里WebView是和Activity进行绑定的,为了避免内存泄露,我们在预先创建的时候,借助Context的中间层MutableContextWrapper,使用MutableContextWrapper包裹applicationContext的方式去提前创建WebView,当使用时,将context置为activity的即可。
// 预创建WebView: MutableContextWrapper contextWrapper = new MutableContextWrapper(applicationContext); mPool[0] = new WebView(contextWrapper); // 使用WebView ((MutableContextWrapper)webview.getContext()).setBaseContext(activityContext);