天天看點

最容易了解的handler

使用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代碼

最容易了解的handler
最容易了解的handler
最容易了解的handler

  1. public class HandlerTest2 extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. // TODO Auto-generated method stub
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. //列印了目前線程的ID
  8. System.out.println("Activity-->" + Thread.currentThread().getId());
  9. //生成一個HandlerThread對象,實作了使用Looper來處理消息隊列的功能,這個類由Android應用程式架構提供
  10. <STRONG>HandlerThread handlerThread = new HandlerThread("handler_thread");</STRONG>
  11. //在使用HandlerThread的getLooper()方法之前,必須先調用該類的start();
  12. <STRONG>handlerThread.start();</STRONG>
  13. <STRONG>MyHandler myHandler = new MyHandler(handlerThread.getLooper());</STRONG>
  14. Message msg = myHandler.obtainMessage();
  15. //将msg發送到目标對象,所謂的目标對象,就是生成該msg對象的handler對象
  16. Bundle b = new Bundle();
  17. b.putInt("age", 20);
  18. b.putString("name", "Jhon");
  19. <STRONG>msg.setData(b);</STRONG>
  20. msg.sendToTarget();
  21. }
  22. <STRONG>class MyHandler extends Handler</STRONG>{
  23. public MyHandler(){
  24. public MyHandler(Looper looper){
  25. super(looper);
  26. public void handleMessage(Message msg) {
  27. <STRONG>Bundle b = msg.getData();</STRONG>
  28. int age = b.getInt("age");
  29. String name = b.getString("name");
  30. System.out.println("age is " + age + ", name is" + name);
  31. System.out.println("Handler--->" + Thread.currentThread().getId());
  32. System.out.println("handlerMessage");

繼續閱讀