創建了一個對象,用完之後如果沒有讓回收機制回收,那麼就是內存泄漏 (memory leak),由於一直佔用着內存,長期的內存泄漏就是導致內存溢出(out of memory )
所以繼承Handler的內部類一定要是靜態的,並且對所在的activity弱引用,這樣引用的外部類才能被回收
爲什麼要設計成靜態的內部類呢?
因爲靜態內部類不能訪問外部類的非靜態成員,這樣就避免了對外部類的強引用,斷開了和外部類的聯繫,這樣外部類就能回收了,但實際上handler類有可能會用到外部類的成員,所有就設計成靜態內部類,並對外部類對象弱引用,需要外部成員,就通過弱引用的外部類對象調用
static class MyHandler extends Handler {
WeakReference mActivity;
MyHandler(PopupActivity activity) {
mActivity = new WeakReference(activity);
}
@Override
public void handleMessage(Message msg) {
PopupActivity theActivity = mActivity.get();
switch (msg.what) {
case 0:
theActivity.popPlay.setChecked(true);
break;
}
}
};