日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Looper、Handler应用---实现主线程向子线程发送消息

發(fā)布時間:2025/6/15 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Looper、Handler应用---实现主线程向子线程发送消息 小編覺得挺不錯的,現(xià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,線程可以主或者子,進而實現(xiàn)線程間消息的傳遞。

    總結(jié)

    以上是生活随笔為你收集整理的Looper、Handler应用---实现主线程向子线程发送消息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。