Android 开发中OOM---WebView优化之路

最近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还是建议使用“单独的进程来处理”!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值