美文网首页
Android引起内存泄露的几个地方

Android引起内存泄露的几个地方

作者: MDZZ灭顶之灾12138 | 来源:发表于2018-10-13 17:49 被阅读22次
  1. 非静态内部类创建静态实例造成的内存泄漏
    将该内部类设为静态内部类或将该内部类抽取出来封装成一个单例,如果需要使用Context,请使用ApplicationContext 。
  2. Handler非静态匿名内部类引起的内存泄露
  private MyHandler mHandler = new MyHandler(this);
    private static class MyHandler extends Handler {
        private WeakReference reference;
        public MyHandler(Context context) {
            reference = new WeakReference<Activity>(context);
        }
        @Override
        public void handleMessage(Message msg) {
            MainActivity activity = (MainActivity) reference.get();
            if(activity != null){
                //处理message
            }
        }
    }
 @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler.removeCallbacksAndMessages(null);
    }

handlerLeak

  1. 异步任务匿名内部类,activity退出时没执行完任务,导致的activity回收不了的内存泄露
 static class MyAsyncTask extends AsyncTask {
        private WeakReference weakReference;
  
        public MyAsyncTask(Context context) {
            weakReference = new WeakReference<>(context);
        }
  
        @Override
        protected Void doInBackground(Void... params) {
            SystemClock.sleep(10000);
            return null;
        }
  
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            MainActivity activity = (MainActivity) weakReference.get();
            if (activity != null) {
                //...
            }
        }
    }
    static class MyRunnable implements Runnable{
        @Override
        public void run() {
            SystemClock.sleep(10000);
        }
    }
//——————
    new Thread(new MyRunnable()).start();
    new MyAsyncTask(this).execute();
  1. 资源未关闭造成的内存泄漏

对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

原文

相关文章

网友评论

      本文标题:Android引起内存泄露的几个地方

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