Android——线程通讯 Handler、Looper、Message;
線程通訊問題
(主要用到了Handler類,Looper類和Message類以及MessageQueue)
在Android中主線程如何向子線程中發送消息的問題。讓我們來想想,這其中的過程,無非就是創建一個Handler對象,然后一個線程發消息,另一個接收消息嘛。下面是接下來需要涉及到的幾個重要類。我們可以把它們想象成以下幾個內容。 信息隊列管家(Looper); 消息隊列(MessageQueue); 消息(Message):可以多個; 信息工人(Handler):可以多個;
下面主要介紹下這幾個類:
1.Looper類,Looper它就像一個消息隊列(MessageQueue)的管家(Looper),一個消息隊列只有一個信息管家,并且管理整個消息隊列,而一個消息隊列內可以容納多個消息(Message),而信息處理者(Handler)也可以有多個,消息隊列處理者派遣他們向消息隊列中存儲或取出消息后執行任務;是用來為一個線程開啟一個消息隊列,通常情況下,Android下新開啟的線程沒有開啟消息隊列的(除了主線程外),主線程系統會默認為其開啟一個消息隊列;looper是通過MessageQueue來存放消息隊列的,一個線程只有一個looper對象。
2.Message類?是定義一個Messge包含必要的描述和屬性數據,并且此對象可以被發送給android.os.Handler處理。屬性字段:arg1、arg2、what、obj、replyTo等;其中arg1和arg2是用來存放整型數據的;what是用來保存消息標識的;obj是Object類型的任意對象;replyTo是消息管理器,會關聯到一個handler,handler就是處理其中的消息。通常對Message對象不是直接new出來的,只要調用handler中的obtainMessage方法來直接獲得Message對象。
3.Handler類,通過handler與looper來實現交互,通過可以把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;的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到大山着火是什么意思
- 下一篇: 晚上梦到猫咬自己是什么征兆