防止Handler导致的内存泄露

先来看一段代码:

public class MyActivity extends Activity {
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState == null) {
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
      public void run() {
        doSomething();
      }
    });
  }

  void doSomething() {
    // Uses the activity instance
  }
}

上面的代码会导致doSomething()方法在Activity因为一个configuration change导致 onDestroy() 方法被调用之后执行,使得activity对象无法及时释放

解决方案:
1.Handler的处理逻辑放到一个独立的class文件,并使用WeakReference引用activity,避免类似doSomething直接引用到activity的情景发生
2.onDestroy之前通过handler.removeCallbacks() 方法从消息队列移除这个消息
3.避免使用static Handler

参考:《Android在横竖屏切换时到底发生了什么
PDF版