最近Android项目中嵌入的html5界面越来越多了,Webview这个强大组件引起的问题越发的多起来,最常见的就是WebView引起的OOM问题。众所周知,Android WebView一直以来都有个很来得严重的BUG:即使它所在的Activity(或者Service)结束也就是onDestroy()之后,或者直接调用WebView.destroy()之后,它所占用这些内存也不会被释放。
常规做法是:把使用了WebView的Activity(或者Service)放在单独的进程里。然后在检测到应用占用内存过大有可能被系统干掉或者它所在的Activity(或者Service)结束后,调用System.exit(0),主动Kill掉进程。由于系统的内存分配是以进程为准的,进程关闭后,系统会自动回收所有内存。真所谓一了百了。如果你的项目是这样做的,这里介绍篇文章:http://blog.csdn.net/u012210186/article/details/52608090 。此文章讲的主要是:“使用第三方 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还是建议使用“单独的进程来处理”!