生活随笔
收集整理的這篇文章主要介紹了
Looper、Handler应用---实现主线程向子线程发送消息
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
準(zhǔn)備知識:
Looper類:
為一個線程開啟一個消息循環(huán),里面有一個消息隊列,新線程是沒有開啟消息循環(huán)的,所以需要用到Looper的方法創(chuàng)建消息循環(huán)(主線程除外,主線程會自動為其創(chuàng)建Looper對象,開啟消息循環(huán)),
MessageQueue存放消息和事件
Handler類:
輔助類,向綁定的Looper投遞消息
Looper原型:
Looper.prepare()
Looper.loop
Looper.quit
代碼:
[java] view plaincopy
package?com.test.looper;????import?android.app.Activity;??import?android.os.Bundle;??import?android.os.Handler;??import?android.os.Looper;??import?android.os.Message;??import?android.util.Log;????public?class?MainActivity?extends?Activity?{??????private?LooperThread??looperThread;????????@Override??????public?void?onCreate(Bundle?savedInstanceState)?{??????????super.onCreate(savedInstanceState);??????????setContentView(R.layout.main);??????????looperThread?=?new?LooperThread();??????????looperThread.start();??????????looperThread.getHandler().sendEmptyMessage(1);??????}??????????????????class?LooperThread?extends?Thread?{??????????private?Handler?mHandler;??????????private?final?Object?mSync?=?new?Object();????????????public?void?run()?{??????????????Looper.prepare();??????????????synchronized?(mSync)?{??????????????????mHandler?=?new?Handler(){??????????????????????@Override??????????????????????public?void?handleMessage(Message?msg)?{??????????????????????????Log.d("CYQ",?"--->"?+?msg);??????????????????????}??????????????????};??????????????????mSync.notifyAll();??????????????}??????????????Looper.loop();??????????}????????????????????public?Handler?getHandler()?{??????????????synchronized?(mSync)?{??????????????????if?(mHandler?==?null)?{??????????????????????try?{??????????????????????????mSync.wait();??????????????????????}?catch?(InterruptedException?e)?{??????????????????????}??????????????????}??????????????????return?mHandler;??????????????}??????????}??????????public?void?exit()?{??????????????getHandler().post(new?Runnable(){??????????????????public?void?run()?{??????????????????????Looper.myLooper().quit();??????????????????}});??????????}??????}??}??
注意一下幾點:
1、new Handler()必須在子線程的run方法中,否則不是子線程的Handler
2、在getHandler方法中,我加入了同步,防止線程start了,但是并沒有run結(jié)束,若此時直接返回mHandler會是一個null(不行可以試試,我一開始郁悶許久,最后在源碼中發(fā)現(xiàn)有更穩(wěn)定的實現(xiàn),所以效仿了,
后記:
看來源碼還是寫得很健壯的,仍需多加學(xué)習(xí)!
總結(jié)一下(也許不對,請懷疑):
一個線程有一個對應(yīng)的Looper,這個Looper就是消息循環(huán),我理解就是提供了一個消息循環(huán)的場所,但是消息的投遞,消息的處理它不做,它會綁定一個Handler,然后Handler去投遞和處理消息,一個線程中實現(xiàn)handleMessage,另外一個線程就可以sendMessage,線程可以主或者子,進(jìn)而實現(xiàn)線程間消息的傳遞。
總結(jié)
以上是生活随笔為你收集整理的Looper、Handler应用---实现主线程向子线程发送消息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。