日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/6/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容還不錯,歡迎將生活随笔推薦給好友。