我們可以找到這樣一個變化:
public class MainActivity extends Activity { private Handler mHandler = newHandler() { @Override public void handleMessage(Message msg) { //TODO handle message... } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHandler.sendMessageDelayed(Message.obtain(), 60000); //just finish this activity finish(); }}
然後運行Android Lint工具會有一個記憶體泄露警告:This Handler class should be static or leaks might occur。
要修改該問題,只需要按照Lint提示的那樣,把Handler類定義為靜態即可,然後通過WeakReference 來保持外部的Activity對象。
private Handler mHandler = new MyHandler(this);private static class MyHandler extendsHandler{ private final WeakReference<Activity> mActivity; public MyHandler(Activity activity) { mActivity = newWeakReference<Activity>(activity); } @Override public void handleMessage(Message msg) { System.out.println(msg); if(mActivity.get() == null) { return; } }}
所以,當你在Activity中使用內部類的時候,需要時刻考慮您是否可以控制該內部類的生命週期,如果不可以,則最好定義為靜態內部類。