Webview性能优化

5 2月

在页面打开前,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);

发表评论

电子邮件地址不会被公开。 必填项已用*标注