之前研究過handler 和 looper 訊息佇列,不過android裡的handler不是另外開啟線程來執行的,還是在主UI線程中,如果想另啟線程的話需要用到HandlerThread來實現。在使用HandlerThread的時候需要實現CallBack介面以重寫handlerMessage方法,在handlerMessage方法中來處理自己的邏輯。下來給出一個小例子程式。
layout檔案很簡單,就一個按鈕來啟動HanlderTread線程
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/handlerThreadBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="startHandlerThread" /></LinearLayout>
Activity代碼如下:
package com.tayue;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Handler.Callback;import android.os.HandlerThread;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/** * * @author xionglei * */public class TestHandlerActivity extends Activity implements OnClickListener{ public Button handlerThreadBTN; MyHandlerThread handlerThread; Handler handler; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //列印UI線程的名稱 System.out.println("onCreate CurrentThread = " + Thread.currentThread().getName()); setContentView(R.layout.main); handlerThreadBTN = (Button) findViewById(R.id.handlerThreadBtn); handlerThreadBTN.setOnClickListener(this); handlerThread = new MyHandlerThread("myHanler"); handlerThread.start(); //注意: 這裡必須用到handler的這個構造器,因為需要把callback傳進去,從而使自己的HandlerThread的handlerMessage來替換掉Handler原生的handlerThread handler = new Handler(handlerThread.getLooper(), handlerThread); } @Override public void onClick(View v) { //點擊按鈕後來開啟線程 handler.sendEmptyMessage(1); } private class MyHandlerThread extends HandlerThread implements Callback { public MyHandlerThread(String name) { super(name); } @Override public boolean handleMessage(Message msg) { //列印線程的名稱 System.out.println(" handleMessage CurrentThread = " + Thread.currentThread().getName()); return true; } } }
點擊按鈕,列印的日誌如下(這裡點擊了3次)
07-06 09:32:48.776: I/System.out(780): onCreate CurrentThread = main
07-06 09:32:55.076: I/System.out(780): handleMessage CurrentThread = myHanler
07-06 09:32:58.669: I/System.out(780): handleMessage CurrentThread = myHanler
07-06 09:33:03.476: I/System.out(780): handleMessage CurrentThread = myHanler
HandlerThread就這麼簡單。
當然 android自己也有非同步線程的handler,就是AsyncTask,這個類就是封裝了HandlerThread 和handler來實現非同步多線程的操作的。