美文网首页
Android WebView引起内存泄露

Android WebView引起内存泄露

作者: 王魔王 | 来源:发表于2018-12-19 08:13 被阅读0次

    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);
        }
    

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

    相关文章

      网友评论

          本文标题:Android WebView引起内存泄露

          本文链接:https://www.haomeiwen.com/subject/ucdzhqtx.html