歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android HandlerThread使用小例

Android HandlerThread使用小例

日期:2017/3/1 10:17:39   编辑:Linux編程

之前研究過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. <TextView
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:text="@string/hello" />
  10. <Button
  11. android:id="@+id/handlerThreadBtn"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="startHandlerThread" />
  15. </LinearLayout>

Activity代碼如下:

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

點擊按鈕,打印的日志如下(這裡點擊了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