解決方案:
step 1.自定義的靜態(tài)handler
step 2.可以加一個(gè)弱引用
step 3.還有一個(gè)主意的就是當(dāng)你activity被銷毀的時(shí)候如果還有消息沒(méi)有發(fā)出去 就remove掉吧
step 4.removecallbacksandmessages去清除Message和Runnable 加null 寫(xiě)在生命周的ondestroy()就行
將非靜態(tài)內(nèi)部類修改為靜態(tài)內(nèi)部類(靜態(tài)內(nèi)部類不會(huì)隱式持有外部類)
當(dāng)使用軟引用或者弱引用的時(shí)候,MainActivity難道很容易或者可以被GC回收嗎?
GC回收的機(jī)制是什么携取?當(dāng)MainActivity不被任何對(duì)象引用
雖然Handler里面用的是軟引用/弱引用攒钳,但是并不意味著不存在其他的對(duì)象引用該MainActivity
當(dāng)MainAcitivity都被回收了,靜態(tài)內(nèi)部Handler中的弱/軟引用也就被回收了雷滋,handler也沒(méi)有存在的意義了
private static class MyHandler extends Handler {
//private Main2Activity mainActivity;//直接持有一個(gè)外部強(qiáng)引用不撑,會(huì)引起內(nèi)存泄露
private WeakReference<Main2Activity> mainActivity;//設(shè)置軟引用保存,當(dāng)內(nèi)存一發(fā)生GC的時(shí)候就會(huì)回收
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:
//加載數(shù)據(jù)
//MainActivity.this.a;//有時(shí)候確實(shí)會(huì)有這樣的需求晤斩,需要引用外部類的資源焕檬,怎么辦
int b = main.a;
break;
}
}
}