您好,登錄后才能下訂單哦!
1.handler為android中多線程間通信的一種機制,
@1android中只允許在UI線程(主線程)操作或改變UI,其他線程不能操作UI。
@2其他線程有刷新UI的需要,所以得告訴UI線程,這時候就用到Handler,在handeMessage方法中處理消息。
@3handler可以定義在主線程也可以定義在其他線程,作用不一樣。
@4與handler執(zhí)行相關(guān)的類:Handler,Message,MessageQueue,Looper
UI線程:主線程,創(chuàng)建時會自動初始化一個Looper對象,也會創(chuàng)建一個消息隊列
Message:消息,其中包含了消息ID,消息處理對象以及處理的數(shù)據(jù)等,由MessageQueue統(tǒng)一列隊,終由Handler處理。
Handler:處理者,負責(zé)Message的發(fā)送及處理。使用Handler時,需要實現(xiàn)handleMessage(Message msg)方法來對特定的Message進行處理,例如更新UI等。
MessageQueue:消息隊列,用來存放Handler發(fā)送過來的消息,并按照FIFO規(guī)則執(zhí)行。當(dāng)然,存放Message并非實際意義的保存,而是將Message以鏈表的方式串聯(lián)起來的,等待Looper的抽取。
Looper:消息泵,不斷地從MessageQueue中抽取Message執(zhí)行。因此,一個MessageQueue需要一個Looper。
Thread:線程,負責(zé)調(diào)度整個消息循環(huán),即消息循環(huán)的執(zhí)行場所。
2.handler的使用
@1用在主線程
---1-定義Handler對象,重寫handleMessage方法,在方法里面處理消息,更新UI
private Handler mHanlder = new Handler(){ public void handleMessage(android.os.Message msg) { numberAdapter = new BlackNumberAdapter(getApplicationContext(), mList, mBnd); lv_blacknum.setAdapter(numberAdapter); }; };
---2-在其他 線程發(fā)送消息,有時需要自己定義消息對象
mHanlder.sendEmptyMessage(BLACKNUM_PREPARED);
@2handler定義在子線程,需要自己創(chuàng)建Looper對象
----流程:
====1.調(diào)用Looper.prepare()為當(dāng)前線程創(chuàng)建Looper對象,此時會自動創(chuàng)建MessageQueue消息隊列;2.創(chuàng)建Handler對象,重寫handleMessage方法;3.調(diào)用Looper.loop()方法啟動Looper消息循環(huán)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。