当前位置: 首页>移动开发>正文

Android webview 性能差 android webview oom

最近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和其它布局是混排的:例如这个页面

Android webview 性能差 android webview oom,Android webview 性能差 android webview oom_内存,第1张

Android webview 性能差 android webview oom,Android webview 性能差 android webview oom_android_02,第2张

(这两张图其实就是一个页面)右边一张图中间的内容部分就是个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还是建议使用“单独的进程来处理”!


https://www.xamrdz.com/mobile/46d1987451.html

相关文章: