Android开发经验谈Android技术知识Android开发

Android开发经验谈:webview内存泄漏

2020-05-28  本文已影响0人  飞鱼_9d08

看了很多WebView内存泄漏的博文,很多文章都有多多少少的问题。

我便在我这篇博文中仔细针对webView内存泄漏进行分析。

看这篇文章的人都应该对webview深恶痛绝

怎么总是释放不掉呢???

释放不掉的原因是啥呢???

为啥特么的总是阴魂不散呢???

答:webView内部的一些线程持有activity对象,导致activity无法释放。继而内存泄漏。

解决:

方案一:退出程序调用

System.exit(0);

弊:太暴力,只能在程序退出后清除持有。

方案二:activity弱应用持有

private WeakReference<BaseWebActivity> webActivityReference = new WeakReference<BaseWebActivity>(this);
bridgeWebView = new BridgeWebView(webActivityReference .get());
bridgeWebView.setLayoutParams(params);
container.addView(bridgeWebView);

在销毁中执行
 @Override
    protected void onDestroy() {
        super.onDestroy();
        //防止webView内存泄漏
        if (bridgeWebView != null) {
            //先从父容器中移除webview,然后再销毁webview
            ViewParent parent = bridgeWebView.getParent();
            if (parent != null) {
                ((ViewGroup) parent).removeView(bridgeWebView);
            }
            bridgeWebView.stopLoading();
            // 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错
            bridgeWebView.getSettings().setJavaScriptEnabled(false);
            bridgeWebView.clearHistory();
            bridgeWebView.clearView();
            bridgeWebView.removeAllViews();
            try {
                bridgeWebView.destroy();
            } catch (Throwable ex) {

            }
            bridgeWebView = null;
            this.webActivityReference.clear();
            this.webActivityReference = null;
        }
    }

说明:

看了很多文章,文中大多都建议不在xml中写webview,都没有说明原因。主要是xml中创建的webview持有Activity的context对象

方案三:新建进程

缺点:新建进程比较麻烦的在于进程间通讯

还存在如下问题

优点:

增加应用可用的内存空间,不与主进程竞争内存空间,不使用进程则销毁。

通讯方式

实例:

//xml配置activity,在remoteweb进程中
<activity android:name=".WebActivity"
   android:process=":remoteweb"/>

上一篇下一篇

猜你喜欢

热点阅读