最近Android项目中嵌入的html5界面越来越多了,Webview这个强大组件引起的问题越发的多起来,最常见的就是WebView引起的OOM问题。众所周知,Android WebView一直以来都有个很来得严重的BUG:即使它所在的Activity(或者Service)结束也就是onDestroy()之后,或者直接调用WebView.destroy()之后,它所占用这些内存也不会被释放。
常规做法是:把使用了WebView的Activity(或者Service)放在单独的进程里。然后在检测到应用占用内存过大有可能被系统干掉或者它所在的Activity(或者Service)结束后,调用System.exit(0),主动Kill掉进程。由于系统的内存分配是以进程为准的,进程关闭后,系统会自动回收所有内存。真所谓一了百了。如果你的项目是这样做的,这里介绍篇文章: 。此文章讲的主要是:“使用第三方 WebView内核” 。可以完美解决WebView造成的OOM问题。但是我现在的项目里,因项目需求,WebView和其它布局是混排的:例如这个页面
(这两张图其实就是一个页面)右边一张图中间的内容部分就是个WebView,其控件是在左边那张图 “规格分类”下面的,
xml部分代码:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:background="#fff"
android:orientation="vertical"
android:paddingLeft="@dimen/left"
android:paddingRight="@dimen/left">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="15sp"/>
<WebView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
像这种的布局,就无法把WebView放在一个单独的进程里,更别提“第三方 WebView内核”了。那这种情况如何去解决WebView造成的OOM的问题呢???于是忽开始搜集各种资料来看......最后还是发现这种方法比较有效:
1.在xml里面不直接写WebView,在这里我是用的FrameLayout.
2.在onCreateView()方法里动态去new 一个WebView加载进来
webFrameLayout = (FrameLayout) view.findViewById(R.id.webFrameLayout);
mWebView = new WebView(getContext().getApplicationContext());
webFrameLayout.addView(mWebView, 0);
3.在onDestroy()方法中释放资源
public void onDestroy() {
mWebView.onPause();
mWebView.destroy();
mWebView = null;
webFrameLayout.removeAllViews();
System.gc();
super.onDestroy();
}
ps:上面有说到,即使调WebView.destroy()方法也不一定会销毁,此举是否为“多此一举”,我也不知道,反正我是这么写了,多写了也不会出错!有兴趣的朋友可以去试下!
另:此方法只适用于WebView和其它布局混排时使用,如果是单独的WebView还是建议使用“单独的进程来处理”!