使用Handler的大緻流程:
1、首先建立一個Handler對象,可以直接使用Handler無參構造函數建立Handler對象,也可以繼承Handler類,重寫handleMessage方法來建立Handler對象。
2、在監聽器中,調用Handler的post方法,将要執行的線程對象添加到線程隊列當中。此時将會把該線程對象添加到handler對象的線程隊列中。
3、将要執行的操作寫線上程對象的run方法中,一般是一個Runnable對象,複寫其中的run方法就可以了。
Handler包含了兩個隊列,其中一個是線程隊列,另外一個是消息隊列。使用post方法會将線程對象放到該handler的線程隊列中,使用sendMessage(Message message)将消息放到消息隊列中。
如果想要這個流程一直執行的話,可以在run方法内部執行postDelayed或者post方法,再将該線程對象添加到消息隊列中,重複執行。想要線程停止執行,調用Handler對象的
removeCallbacks(Runnable r)
方法從線程隊列中移除線程對象,使線程停止執行。
Handler為Android提供了一種異步消息處理機制,當向消息隊列中發送消息(sendMessage)後就立即傳回,而從消息隊列中讀取消息時會阻塞,其中從消息隊列中讀取消息時會執行Handler中的public void handleMessage(Message msg) 方法,是以在建立Handler時應該使用匿名内部類重寫該方法,在該方法中寫上讀取到消息後的操作,使用Handler的obtainMessage() 來獲得消息對象。
Handler與線程的關系:
使用Handler的post方法将Runnable對象放到Handler的線程隊列中後,該Runnable的執行其實并未單獨開啟線程,而是仍然在目前Activity線程中執行的,Handler隻是調用了Runnable對象的run方法。
Bundle是什麼:
Bundle是一個特殊的map,它是傳遞資訊的工具,它的鍵隻能是string類型,而且值也隻能是常見的基本資料類型。
如何讓Handler執行Runnable時打開新的線程:
1、首先生成一個HandlerThread對象,實作了使用Looper來處理消息隊列的功能,這個類由Android應用程式架構提供
HandlerThread handlerThread = new HandlerThread("handler_thread");
2、在使用HandlerThread的getLooper()方法之前,必須先調用該類的start();
handlerThread.start();
3、根據這個HandlerThread對象得到其中的Looper對象。
4、建立自定義的繼承于Handler類的子類,其中實作一個參數為Looper對象的構造方法,方法内容調用父類的構造函數即可。
5、使用第三步得到的Looper對象建立自定義的Handler子類的對象,再将消息(Message)發送到該Handler的消息隊列中,Handler複寫的handleMessage()将會執行來處理消息隊列中的消息。
消息,即Message對象,可以傳遞一些資訊,可以使用arg1.arg2,Object傳遞一些×××或者對象,還可以使用Message對象的setData(Bundle bundle)來講Bundle對象傳遞給新建立的線程,新建立的線程在執行handleMessage(Message msg)時可以從message中利用getData()提取出Bundle對象來進行處理。
Java代碼
- public class HandlerTest2 extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //列印了目前線程的ID
- System.out.println("Activity-->" + Thread.currentThread().getId());
- //生成一個HandlerThread對象,實作了使用Looper來處理消息隊列的功能,這個類由Android應用程式架構提供
- <STRONG>HandlerThread handlerThread = new HandlerThread("handler_thread");</STRONG>
- //在使用HandlerThread的getLooper()方法之前,必須先調用該類的start();
- <STRONG>handlerThread.start();</STRONG>
- <STRONG>MyHandler myHandler = new MyHandler(handlerThread.getLooper());</STRONG>
- Message msg = myHandler.obtainMessage();
- //将msg發送到目标對象,所謂的目标對象,就是生成該msg對象的handler對象
- Bundle b = new Bundle();
- b.putInt("age", 20);
- b.putString("name", "Jhon");
- <STRONG>msg.setData(b);</STRONG>
- msg.sendToTarget();
- }
- <STRONG>class MyHandler extends Handler</STRONG>{
- public MyHandler(){
- public MyHandler(Looper looper){
- super(looper);
- public void handleMessage(Message msg) {
- <STRONG>Bundle b = msg.getData();</STRONG>
- int age = b.getInt("age");
- String name = b.getString("name");
- System.out.println("age is " + age + ", name is" + name);
- System.out.println("Handler--->" + Thread.currentThread().getId());
- System.out.println("handlerMessage");