美文网首页Android填坑之路
日常开发的你一定没有处理的OOM

日常开发的你一定没有处理的OOM

作者: 一洼世界 | 来源:发表于2017-03-28 00:21 被阅读10次

    这里转载了一款文章,点击观看。详细的介绍了日常开发中经常使用的一些单例,线程,Handler一类的OOM的防止和处理。

    内存优化很棒的一篇文章

    1.单例产生的内存溢出
    2.handler产生的内存溢出
    3.线程造成的内存溢出。AsyncTask
    4.非静态内部类创建静态实例内存溢出。对外部的一个引用。
    5.webview
    6.资源未关闭。

    webview的解决方案:

    其中一种就是使用getApplicationgContext作为参数构建WebView,然后动态添加到一个ViewGroup中,最后退出的时候调用webView的销毁的函数,虽然也达到了防止内存溢出的效果,但是在有些网页弹出时候需要记住密码的对话框的时候,会出现Unable to add window -- token null is not for an application 的错误,所以这里采用的解决办法是通过把使用了WebView的Activity(或者Service)放在单独的进程里。然后在检测到应用占用内存过大有可能被系统干掉或者它所在的Activity(或者Service)结束后,调用android.os.Process.killProcess(android.os.Process.myPid());,主动Kill掉进程。由于系统的内存分配是以进程为准的,进程关闭后,系统会自动回收所有内存。

    public class MainActivity5 extends AppCompatActivity {
    
     private WebView mWebView;
    
    @Override
    
     protected  void onCreate(Bundle savedInstanceState) {
        super .onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        mWebView = (WebView) findViewById(R.id.web);
         mWebView.loadUrl(
              "http://www.cnblogs.com/whoislcj/p/5720202.html");
     }
    
     @Override
    protected void onDestroy() {
        destroyWebView();
        android.os.Process.killProcess(android.os.Process.myPid());
        super .onDestroy();
    }
    
     
      
    private void destroyWebView() {
     if (mWebView != null ) {
         mWebView.pauseTimers();
         mWebView.removeAllViews();
         mWebView.destroy();
        mWebView = null ;
      }
     }
    
     
    }
    

    相关文章

      网友评论

        本文标题:日常开发的你一定没有处理的OOM

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