歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android HandlerThread使用小例

之前研究過handler 和 looper 消息隊列,不過Android裡的handler不是另外開啟線程來執行的,還是在主UI線程中,如果想另啟線程的話需要用到HandlerThread來實現。在使用HandlerThread的時候需要實現CallBack接口以重寫handlerMessage方法,在handlerMessage方法中來處理自己的邏輯。下來給出一個小例子程序。

layout文件很簡單,就一個按鈕來啟動HanlderTread線程

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="@string/hello" />  
  11.   
  12.     <Button  
  13.         android:id="@+id/handlerThreadBtn"  
  14.         android:layout_width="wrap_content"  
  15.         android:layout_height="wrap_content"  
  16.         android:text="startHandlerThread" />  
  17.   
  18. </LinearLayout>  

Activity代碼如下:

  1. package com.tayue;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Handler.Callback;  
  7. import android.os.HandlerThread;  
  8. import android.os.Message;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. /** 
  13.  *  
  14.  * @author xionglei 
  15.  * 
  16.  */  
  17. public class TestHandlerActivity extends Activity implements OnClickListener{  
  18.       
  19.     public Button handlerThreadBTN;   
  20.     MyHandlerThread handlerThread;  
  21.     Handler handler;  
  22.       
  23.     /** Called when the activity is first created. */  
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         //打印UI線程的名稱   
  28.         System.out.println("onCreate  CurrentThread = " + Thread.currentThread().getName());  
  29.           
  30.         setContentView(R.layout.main);  
  31.           
  32.         handlerThreadBTN = (Button) findViewById(R.id.handlerThreadBtn);  
  33.         handlerThreadBTN.setOnClickListener(this);  
  34.           
  35.         handlerThread = new MyHandlerThread("myHanler");  
  36.         handlerThread.start();  
  37.         //注意: 這裡必須用到handler的這個構造器,因為需要把callback傳進去,從而使自己的HandlerThread的handlerMessage來替換掉Handler原生的handlerThread   
  38.         handler = new Handler(handlerThread.getLooper(), handlerThread);  
  39.           
  40.           
  41.     }  
  42.   
  43.     @Override  
  44.     public void onClick(View v) {  
  45.         //點擊按鈕後來開啟線程   
  46.         handler.sendEmptyMessage(1);  
  47.     }  
  48.       
  49.       
  50.     private class MyHandlerThread extends HandlerThread implements Callback {  
  51.   
  52.         public MyHandlerThread(String name) {  
  53.             super(name);  
  54.         }  
  55.   
  56.         @Override  
  57.         public boolean handleMessage(Message msg) {  
  58.             //打印線程的名稱   
  59.             System.out.println(" handleMessage CurrentThread = " + Thread.currentThread().getName());  
  60.             return true;  
  61.         }  
  62.           
  63.           
  64.     }  
  65.       
  66.       
  67.       
  68.       
  69. }  

點擊按鈕,打印的日志如下(這裡點擊了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來實現異步多線程的操作的。

Copyright © Linux教程網 All Rights Reserved