泄露原因
在这次开发过程中,需要用到webview展示但是当频繁的退出再进入包含WebView 的Activit时,会出现内存泄露。有人说,一旦在你的xml布局中引用了webview甚至没有使用过,都会阻碍重新进入Application之后对内存的gc。包括使用MapView有时一会引发OOM,几经周折在网上看到各种解决办法,在这里跟大家分享一下。但是到目前为止还没有找到根本的解决办法,网上也有说是sdk的bug。但是不管怎么样,我们还是需要使用的。
解决方案一 开启独立进程,与主进程隔开
在混合型app中WebView是主角,一切由它呈现,如58同城,赶集网等;在另一些超级app中亦有它的影子,微信,qq,支付宝,没有一个超级app能少了它,既能展示最新最潮的实时资讯,又能扮演盘踞一方的全功能型网站,与native结合后又能扮演诸如公众号之内的应用等等,其能力可想而知。
然而WebView内存泄漏是众所周知的,建议另外启动一个进程专门运行WebView。不要9998,不要9999,我们要100%!WebView用完之后就把进程杀死,即使泄漏了也无碍。
对于封装的webactivity,在manifest.xml
<activity
android:name=".webview.WebViewActivity"
android:launchMode="singleTop"
android:process=":remote"
android:screenOrientation="unspecified" />
然后在关闭webactivity时销毁进程
@Overrideprotected void onDestroy() {
super.onDestroy();
System.exit(0);
}
关闭浏览器后便销毁整个进程,这样一般95%
的情况下不会造成内存泄漏之类的问题,但这就涉及到android进程间通讯,比较不方便处理, 优劣参半,也是可选的一个方案
解决方案二 不要在布局文件添加WebView
首先使用webview的时候,不在xml里面声明,而是直接代码new个对象,传入application context防止activity引用滥用.
webView = new BridgeWebView(getContext().getApplicationContext());
webFrameLayout.addView(webView, 0);
在使用了这个方式后,基本上90%的webview内存泄漏的问题便得以解决