先說為什麼需要handler:
android的主線程又叫ui線程,用于處理與ui相關的時間。android隻允許在主線程中修改ui元件,當我們在其他線程中需要修改ui界面時,就需要發送消息到主線程,再由主線程來處理ui的修改事件。
在ui線程中執行耗時操作或網絡操作,否則會抛出anr (“application not responding”)異常或networkonmainthreadexceptionwill異常。
在這些時候,我們用handler來進行消息的傳遞和處理。
下面來介紹handler類:
(1)兩個主要功能:
1.在非主線程中發送消息。
2.在主線程中擷取、處理消息。
(2)一起工作的幾個元件
message:handler接收和處理的消息對象
looper:每個線程有一個looper,負責管理messagequeue。它的loop方法不斷從messagequeue中抽取message交給handler處理。
messagequeue:由looper負責管理的消息隊列,用fifo的方式管理message。looper的構造器中會建立一個messagequeue對象。
(3)handler用于發送、處理message的方法:
void handlemessage(message msg):處理消息的方法,需要自己重寫。
boolean hasmessages(int what, object object):檢查消息隊列中是否包含what屬性為指定值且object屬性為指定對象的消息。
boolean hasmessages(int what):檢查消息隊列中是否包含what屬性為指定值的消息。
message obtainmessage():擷取消息。
boolean sendemptymessage(int what):發送空消息。
boolean sendemptymessageattime(int what, long uptimemillis):在指定的時間發送空消息。
boolean sendemptymessagedelayed(int what, long delaymillis):一段時間後發送空消息。
boolean sendmessage(message msg):發送消息。
boolean sendmessageatfrontofqueue(message msg):消息加入到消息隊列的最前面。
boolean sendmessageattime(message msg, long uptimemillis):在指定時間發送消息。
boolean sendmessagedelayed(message msg, long delaymillis):一段時間後發送消息。
(4)handler的消息處理機制:
開發者需要重寫handler類的消息處理方法,但新啟動的線程發送消息時,消息會發送到與之關聯的messagequeue,handler不斷從messagequeue中擷取并處理消息,在此時調用消息處理方法。
(5)利用handler處理其他線程中需要作出的ui修改:
android系統在啟動的時候會為activity建立一個消息隊列和消息循環(looper)。為了處理非主線程中的ui處理要求,我們首先在新線程中發送消息,然後在主線程中重寫handler的handlemessage()方法實作ui修改的要求。