android中使用Handler進行線程間通訊和消息的異步處理,在定義Handler時,有多種不同方式,常用的如
Handler handler = new Handler(){...}
這種寫法存在內存泄漏風險,因爲handler會持有匿名對象的引用,匿名對象會持有外部類對象的引用,且handler的生命週期較爲特殊,並不會隨activity(或fragment)結束而結束,所以,如果activity結束了,但是你的handler還存在未處理完的消息,其生命還在,這時候handler會阻止activity的回收,則會引起內存泄漏等不可控風險。
正確做法有兩種:
1.靜態內部類實現,這是最標準的寫法。
private MyHandler handler = new MyHandler(this);
static class MyHandler extends Handler {
WeakReference weakReference;
public MyHandler(SecondActivity activity) {
weakReference = new WeakReference(activity);
}
@Override
public void handleMessage(Message msg) {
}
}
對外部類進行弱引用,GC時此引用可被自動回收。
2.使用Handler.Callback接口
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return false;
}
});
此方法需要在onDestroy方法中調用handler.removeCallbacksAndMessages(null); 來清空消息。或者加入用弱引用
Handler handler = new Handler(new WeakReference<Handler.Callbacks>(new Handler.Callback(
@overridepublic
boolean handleMessage(Message msg) {
})).get());
這樣在堆中匿名對象只有指向它的弱引用,gc回收可以回收它。
參考:https://blog.csdn.net/try_zp_catch/article/details/78900031