Android Handler詳解


導讀:首先創建一個Handler對象,可以直接使用Handler無參構造函數創建Handler對象,也可以繼承Handler類,重寫handleMessage方法來創建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) {
stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//打印了當前線程的ID
System.out.println("Activity-->" + Thread.currentThread().getId());
//生成一個HandlerThread對象,實現了使用Looper來處理消息隊列的功能,這個類由Android應用程序框架提供
HandlerThread handlerThread = new HandlerThread("handler_thread"); 11 //在使用HandlerThread的getLooper()方法之前,必須先調用該類的start();
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage();
//將msg發送到目標對象,所謂的目標對象,就是生成該msg對象的handler對象
Bundle b = new Bundle(); 17 b.putInt("age", 20);
b.putString("name", "Jhon");
msg.setData(b);
msg.sendToTarget();
}
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looper looper){
super(looper); 29 }
@Override
public void handleMessage(Message msg) {
Bundle b = msg.getData();
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");
}
}
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM