解决Handler AsyncTask导致OOM - xiaoniudonghe2015/Android-Java-Code-Style GitHub Wiki

Handler导致OOM

当使用内部类(包括匿名类)来创建Handler的时候,Handler对象会隐式地持有一个外部类对象(通常是一个Activity)的引用, 就导致该Activity无法被回收(即内存泄露),如果你执行了Handler的postDelayed()方法,该方法会将你的Handler装入一个Message,并把这条Message推到MessageQueue中,那么在你设定的delay到达之前,会有一条MessageQueue -> Message -> Handler -> Activity的链,导致你的Activity被持有引用而无法被回收.

private static class  MainHandler extends Handler {
        private WeakReference<MainActivity> weakReference;

        public MainHandler(MainActivity activity) {
            weakReference = new WeakReference<>(activity);
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            MainActivity activity = weakReference.get();
            if (activity == null) {
                return;
            }
        }
    }

AsyncTask导致OOM

当用户开启线程后,退出界面,多次进入。由于线程持有Activity的变量的实例,导致Activity无法被回收,从而导致内存泄漏 解决方式:采用弱引用的方式,将线程与Activity进行解耦。

  private static class FirstQueryAsyncTask extends AsyncTask<String, Void, Void> {
        private WeakReference<MainActivity> weakReference;

        public FirstQueryAsyncTask(MainActivity activity) {
            weakReference = new WeakReference<MainActivity>(activity);
        }

        @Override
        protected Void doInBackground(String... params) {
            MainActivity activity = weakReference.get();
            if (activity == null) {
                return null;
            }
            return null;
        }

        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            MainActivity activity = weakReference.get();
            if (activity == null) {
                return;
            }
        }
    }