生活随笔
收集整理的這篇文章主要介紹了
Looper、Handler应用---实现主线程向子线程发送消息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
準備知識:
Looper類:
為一個線程開啟一個消息循環,里面有一個消息隊列,新線程是沒有開啟消息循環的,所以需要用到Looper的方法創建消息循環(主線程除外,主線程會自動為其創建Looper對象,開啟消息循環),
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結束,若此時直接返回mHandler會是一個null(不行可以試試,我一開始郁悶許久,最后在源碼中發現有更穩定的實現,所以效仿了,
后記:
看來源碼還是寫得很健壯的,仍需多加學習!
總結一下(也許不對,請懷疑):
一個線程有一個對應的Looper,這個Looper就是消息循環,我理解就是提供了一個消息循環的場所,但是消息的投遞,消息的處理它不做,它會綁定一個Handler,然后Handler去投遞和處理消息,一個線程中實現handleMessage,另外一個線程就可以sendMessage,線程可以主或者子,進而實現線程間消息的傳遞。
總結
以上是生活随笔為你收集整理的Looper、Handler应用---实现主线程向子线程发送消息的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。