作用:個(gè)人感覺就是管理線程的消息隊(duì)列的础钠,比如在管理主線程的消息隊(duì)列的時(shí)候启涯,會(huì)把一些復(fù)雜的操作放到其他線程做操作绝葡,然后把最后的結(jié)果加到主線程的消息隊(duì)列里招驴,然后觸發(fā)handleMessage進(jìn)行處理
解決辦法:靜態(tài)內(nèi)部類+ 弱引用
使用:大家用的時(shí)候 肯定會(huì)考慮到如何防止內(nèi)存泄漏的問題
問題1:為什么handler會(huì)引起內(nèi)存泄漏
我們都知道 非靜態(tài)的內(nèi)部類或是匿名類回持有外部類的引用,這樣的話在一個(gè)Activity中她奥,handelr持有activtiy的對(duì)象的引用瓮增,當(dāng)handler還沒有執(zhí)行完畢,但是關(guān)閉activtiy哩俭,正常activtiy關(guān)閉了就會(huì)被回收绷跑,但是handler還沒有釋放,還持有者activity的對(duì)象凡资,這樣activity的對(duì)象即使在內(nèi)存不足的時(shí)候也不會(huì)被回收砸捏,這樣反復(fù)操作,多了的話就會(huì)容易出現(xiàn)oom
問題2:為什么靜態(tài)內(nèi)部類+ 弱引用可以解決
靜態(tài)的內(nèi)部類不回持有外部類的引用隙赁,但是這樣我們又拿不到當(dāng)前activtiy的對(duì)象了垦藏,所以加個(gè)弱引用,這樣的話伞访,我們即能不持有外部類的引用掂骏,也能獲取到當(dāng)前activtiy的對(duì)象,當(dāng)handler沒有處理完畢厚掷,就關(guān)閉的activtiy的時(shí)候弟灼,因?yàn)槭侨跻眉督猓珿C也一樣會(huì)回收 activtiy這個(gè)對(duì)象的,這樣就解決了
下面是個(gè)簡單的例子
private static class MyHandler extends Handler {//定義成靜態(tài)的內(nèi)部類
WeakReference<MainActivity> weakReference;//弱引用
MyHandler(MainActivity activity) {
weakReference = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
MainActivity activity = weakReference.get();
switch (msg.what) {
case 1:
activity.textView.setText((String) msg.obj);
break;
default:
break;
}
}
}