一袭灯、什么是Handler
Android中降传,只有主線程能更新UI莉擒,如果在子線程更新UI則會拋出異常姆打。因此需要使用Handler伤柄,Handler是一種更新UI的機(jī)制尺迂,可以在子線程完成耗時(shí)操作之后吸重,通過Handler發(fā)送消息通知主線程來更新UI岭佳。
Handler通過發(fā)送和處理Message和Runnable對象來關(guān)聯(lián)相對應(yīng)線程的MessageQueue霞篡。
1.可以讓對應(yīng)的Message和Runnable在未來的某個(gè)時(shí)間點(diǎn)進(jìn)行處理世蔗。
2.讓自己想要處理的耗時(shí)操作放在子線程,讓更新UI的操作都放在主線程朗兵。
Handler的作用:發(fā)送消息污淋;接收和處理消息。
二余掖、Handler的使用方法
1.post(runnable) //此時(shí)更新UI的操作寫在Runnable中
2.sendMessage(message) //此時(shí)更新UI的操作寫在Handler的handleMessage方法中寸爆。
在類的成員屬性中新建一個(gè)Handler并復(fù)寫handleMessage方法,這個(gè)Handler是綁定在主線程上的盐欺,在子線程中執(zhí)行完耗時(shí)操作之后赁豆,新建一個(gè)Message對象,為其設(shè)置what屬性冗美,之后通過Handler的sendMessage(message)方法給主線程發(fā)送消息魔种,之后Handler會調(diào)用handleMessage方法進(jìn)行處理。
三墩衙、Handler機(jī)制的原理
Looper是每個(gè)線程所獨(dú)有的务嫡,通過loop方法,讀取所綁定的MessageQueue中的消息漆改,讀到消息之后心铃,把消息發(fā)送給Handler進(jìn)行處理;而Handler發(fā)送的消息挫剑,會發(fā)送到相關(guān)線程的MessageQueue去扣,而MessageQueue又是Looper所關(guān)聯(lián)的,所以Handler要發(fā)送消息必須有一個(gè)維護(hù)它的Looper樊破。Looper愉棱、MessageQueue、Handler三者是相關(guān)聯(lián)的哲戚。
四奔滑、Handler引起的內(nèi)存泄漏以及解決辦法
泄漏原因:當(dāng)Handler不是靜態(tài)內(nèi)部類的時(shí)候,它會隱秘地持有Activity的引用顺少;當(dāng)Activity想要回收的時(shí)候朋其,Handler內(nèi)部可能在做一些耗時(shí)操作王浴,Handler不能被釋放,所以它所持有地Activity的引用也不能被釋放梅猿。導(dǎo)致Activity沒有被回收氓辣,造成了內(nèi)存泄漏。
解決辦法:
1.Handler內(nèi)部持有外部Activity的弱引用袱蚓。
2.把Handler改成靜態(tài)內(nèi)部類钞啸。
3.調(diào)用mHandler.removeCallback()。