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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android——线程通讯 Handler、Looper、Message;

發布時間:2023/11/29 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android——线程通讯 Handler、Looper、Message; 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線程通訊問題

(主要用到了Handler類,Looper類和Message類以及MessageQueue

Android主線程如何向子線程中發送消息的問題。讓我們來想想,這其中的過程,無非就是創建一個Handler對象,然后一個線程發消息,另一個接收消息嘛。下面是接下來需要涉及到的幾個重要類。我們可以把它們想象成以下幾個內容。 信息隊列管家(Looper); 消息隊列(MessageQueue); 消息(Message):可以多個; 信息工人(Handler):可以多個;

下面主要介紹下這幾個類:

1.LooperLooper它就像一個消息隊列(MessageQueue)的管家(Looper),一個消息隊列只有一個信息管家,并且管理整個消息隊列,而一個消息隊列內可以容納多個消息(Message),而信息處理者(Handler)也可以有多個,消息隊列處理者派遣他們向消息隊列中存儲或取出消息后執行任務;是用來為一個線程開啟一個消息隊列,通常情況下,Android下新開啟的線程沒有開啟消息隊列的(除了主線程外),主線程系統會默認為其開啟一個消息隊列;looper是通過MessageQueue來存放消息隊列的,一個線程只有一個looper對象。

2.Message?是定義一個Messge包含必要的描述和屬性數據,并且此對象可以被發送給android.os.Handler處理。屬性字段:arg1、arg2、what、objreplyTo等;其中arg1arg2是用來存放整型數據的;what是用來保存消息標識的;objObject類型的任意對象;replyTo是消息管理器,會關聯到一個handlerhandler就是處理其中的消息。通常對Message對象不是直接new出來的,只要調用handler中的obtainMessage方法來直接獲得Message對象。

3.Handler,通過handlerlooper來實現交互,通過可以把handler看做是looper的一個接口,用來向指定的looper發送消息和處理消息。Handler主要有兩個用途:首先是可以定時處理或者分發消息,其次是可以添加一個執行的行為在其它線程中執行,對于Handler中的方法,可以選擇你關心的操作去覆蓋它,處理具體的業務操作,常見的就是對消息的處理可以覆蓋public void handleMessage(參數)方法,可以根據參數選擇對此消息是否需要做出處理。

注意:默認情況下,handler會與線程內定義的Looper綁定在非主線程中定義Handler=new Hander()會報錯,原因是非主線程中默認沒有創建Looper對象,需要先調用Looper.prepare()啟用Looper??還有就是寫在Looper.loop()之后的代碼不會被執行,這個函數內部應該是一個循環,當調用mHandler.getLooper().quit()后,looper才會中止,其后的代碼才能得以運行。?

Message機制原理示意圖:

Activity、IntentReceiver ??<------> ?Handler<-----> ?Looper<-----> ?MessageQueue ???

?

下面是一個實例來實現主線程內發送消息到線程類內:

?

  • package?com.example.xx;??

  • ??

  • import?android.os.Bundle;??

  • import?android.os.Looper;??

  • import?android.os.Message;??

  • import?android.app.Activity;???

  • import?android.view.View;??

  • import?android.view.View.OnClickListener;??

  • import?android.widget.Button;????

  • public?class?MainActivity?extends?Activity?{??

  • ?? Private static final int MAKE = 0x1;

  • ?????Private Button button;

  • ????@Override??

  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??

  • ????????super.onCreate(savedInstanceState);??

  • ??? ...??//這里是簡單的獲取組件

  • ????????final?LooperThread?looperThread?=?new?LooperThread();??

  • ????????looperThread.start();??

  • ????????button.setOnClickListener(new?OnClickListener()?{??

  • ??

  • ????????????@Override??

  • ????????????public?void?onClick(View?v)?{??

  • ????????????????//?TODO?Auto-generated?method?stub??

  • ???????????????String info=”這是內容";

  • ????????????????Message?msMessage?=?new?Message();??

  • ????????????????msMessage.what=MAKE;??

  • ???????????????msMessage.obj =info;

  • ????????????????looperThread.handler.sendMessage(msMessage);??

  • ????????????}??

  • ????????});??

  • ????}??

  • }??


    下面是線程類,用來接收主線程內發送過來的消息

  • package?com.example.xx;?

  • import?android.os.Handler;??

  • import?android.os.Looper;??

  • import?android.os.Message;??

  • import?android.util.Log;??

  • ??

  • public?class?LooperThread?extends?Thread?{??

  • ????public?static?Handler?handler;??

  • ??

  • ????@Override??

  • ????public?void?run()?{??

  • ????????//?TODO?Auto-generated?method?stub??

  • ????????super.run();??

  • ????????Looper.prepare();??

  • ????????handler?=?new?Handler()?{??

  • ??

  • ????????????@Override??

  • ????????????public?void?handleMessage(Message?msg)?{??

  • ????????????????//?TODO?Auto-generated?method?stub??

  • ???????????????If( Msg.what == MAKE){

  • ?????????????????????System.out.println("--"?+?msg.obj.toString());?

  • ??????????????????}??

  • ????????????}??

  • ????????};??

  • ????????Looper.loop();?

  • ????}??

  • }??

    ?

  • 轉載于:https://www.cnblogs.com/llw1996/p/6743794.html

    總結

    以上是生活随笔為你收集整理的Android——线程通讯 Handler、Looper、Message;的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。