Android WebView引起内存泄露

WebView会引起内存泄露这是地球人都知道的事情了,这是因为如果在xml文件中定义WebView的话,WebView会对当前的Activity持有引用,这样会引起Activity无法正常销毁从而引起Activity的内存泄露。

解决方式:

一、手动添加WebView,手动销毁

1.不要在XML中声明WebView,而是在Activity中手动添加


    //Activity的onCreate方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //LinearLayout的作用是承载WebView
        LinearLayout linearLayout = new LinearLayout(this);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
        //Context对象要传Application
        mWebView = new WebView(getApplicationContext());
        linearLayout.addView(mWebView,params);
        //将LinearLayout设置给Activity
        setContentView(linearLayout);
    }

2.手动销毁WebView

  /**
     * activity的onDestroy()方法
     */
    @Override
    protected void onDestroy() {
        
        //注意WebView的处理要写在super.onDestroy()之前
        if (mWebView != null) {

            mWebView.loadDataWithBaseURL(null,"","text/html","utf-8",null);
            mWebView.stopLoading();

           
            ViewGroup parent = (ViewGroup) mWebView.getParent();
            if (parent != null) {
                parent.removeView(mWebView);
            }
            mWebView.clearHistory();
            mWebView.destroy();
             mWebView=null;
        }

        super.onDestroy();

    }

这种处理方式网上对其效果褒贬不一,有说有效果的,有说没有效果的,估计是不同的版本效果不一致,甚至不同的机型效果都可以不一致,这里仅作记录使用

二、多进程

在Android开启多进程非常简单,你只需要给需要开启多进程的Activity或者Service指定process属性即可
1.Manifest的配置

  <activity android:name=".home.activity.WebActivity" android:process=":web">
           <intent-filter>
               <action android:name="com.test.home.activity.WebActivity"/>
               <category android:name="android.intent.category.DEFAULT"/>
           </intent-filter>
       </activity>

2.启动代码

 Intent intent = new Intent("com.test.home.activity.WebActivity");
 startActivity(intent);

3.销毁代码

 /**
     * activity的onDestroy()方法
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //销毁新开启的进程
        System.exit(0);
    }

这种处理方式毫无疑问可以防止内存泄露,而且代码量也比较小。而其带来的副作用也是显而易见的---你需要处理多进程的问题。如果业务不复杂,那么使用这种方式是没有问题的,如果业务比较复杂,建议还是不要使用此方式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • 一 Activity 1 Activity 生命周期 1.1 Activity 的四种状态 running 当前...
    _执_念__阅读 10,591评论 0 91
  • HereAndroid的内存优化是性能优化中很重要的一部分,而避免OOM又是内存优化中比较核心的一点。这是一篇关于...
    HarryXR阅读 3,862评论 1 24
  • View 自定义View中在onDraw()方法中可以设置padding吗?答案是不能,设置padding后,Vi...
    ElvenShi阅读 1,930评论 0 0
  • 我的人家说要来着 但复古风的宋芳发虢国夫人
    sym527阅读 246评论 0 0