解決方案:
step 1.自定義的靜態handler
step 2.可以加一個弱引用
step 3.還有一個主意的就是當你activity被銷毀的時候如果還有消息沒有發出去 就remove掉吧
step 4.removecallbacksandmessages去清除Message和Runnable 加null 寫在生命周的ondestroy()就行
將非靜態內部類修改為靜態內部類(靜態內部類不會隱式持有外部類)
當使用軟引用或者弱引用的時候,MainActivity難道很容易或者可以被GC回收嗎?
GC回收的機制是什么?當MainActivity不被任何對象引用
雖然Handler里面用的是軟引用/弱引用,但是并不意味著不存在其他的對象引用該MainActivity
當MainAcitivity都被回收了,靜態內部Handler中的弱/軟引用也就被回收了,handler也沒有存在的意義了
private static class MyHandler extends Handler {
//private Main2Activity mainActivity;//直接持有一個外部強引用,會引起內存泄露
private WeakReference<Main2Activity> mainActivity;//設置軟引用保存,當內存一發生GC的時候就會回收
public MyHandler(Main2Activity mainActivity) {
this.mainActivity = new WeakReference<Main2Activity>(mainActivity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Main2Activity main = mainActivity.get();
if (main == null || main.isFinishing()) {
return;
}
switch (msg.what) {
case 0:
//加載數據
//MainActivity.this.a;//有時候確實會有這樣的需求,需要引用外部類的資源,怎么辦
int b = main.a;
break;
}
}
}