1、Webview预加载
App启动就初始化一次WebView。副作用是WebView的初始化必须位于主线程,但主线程会阻塞其他业务代码导致ANR
public class App extends Application {
@Override
public void onCreate() {
...
WebView webView = new WebView(this); // 无脑初始化一次Webview
webView.destroy();
webView = null;
}
}
2、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);
3、独立进程
Android允许一个app同时存在多个进程,可以根据需要把不同的模块放到不同进程中处理。
好处
1.有效增大App的运存,减少由webview引起的内存泄露对主进程内存的占用。
2.避免WebView的Crash影响App主进程的运行。
3.拥有对WebView独立进程操控权。
弊端
WebView进程与其他进程通讯的方式,把webview独立进程之后会发现,埋点功能和接收主进程数据都不正常了,这里就涉及到进程间通讯的问题了;
进程通讯大概就是这几种,aidl,messager,content provider,广播;
<!-- 在AndroidManifest中配置 android:process=":webview" -->
<!-- **进程格式:包名+冒号+进程名 ----默认包名可以不写 格式:冒号+进程名
:webview
** -->
<activity
android:name=".ui.details.WebViewActivity"
android:process=":webview"
android:screenOrientation="portrait" />