解决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;
}
}
}