Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> HandlerThread,handlerthread用法

HandlerThread,handlerthread用法

編輯:關於android開發

HandlerThread,handlerthread用法


一、概念

    1、Android中Handler的使用,一般都在UI主線程中執行,因此在Handler接收消息後,處理消息時,不能做一些很耗時的操作,否則將出現ANR錯誤。

   2、HandlerThread繼承於Thread,所以它本質就是個Thread。(本身是一個線程)

   3、與普通Thread的差別就在於,主要的作用是建立了一個線程,並且創立了消息隊列,有自己的looper,可以讓我們在自己的線程中分發和處理消息。


二、注意

    1、Handler的處理過程運行在創建Handler的線程裡

    2、一個線程對應一個Looper,一個Looper對應一個MessageQueue,一個Looper可以對應多個Handler。

    3、handler應該由處理消息的線程創建。

    4、handler與創建它的線程相關聯,而且也只與創建它的線程相關聯。handler運行在創建它的線程中,所以,如果在handler中進行耗時的操作,會阻塞創建它的線程。

     5、Looper.myLooper();        //獲得當前的Looper

 

        Looper.getMainLooper()   //獲得UI線程的Lopper

     6、Handle的初始化函數(構造函數),如果沒有參數,那麼他就默認使用的是當前的Looper,如果有Looper參數,就是用對應的線程的Looper。

     7、如果一個線程中調用Looper.prepare(),那麼系統就會自動的為該線程建立一個消息隊列,然後調用Looper.loop();之後就進入了消息循環,這個之後就可以發消息、取消息、和處理消息。

 

三、什麼是HandlerThread

        Android的線程分為有消息循環的線程和沒有消息循環的線程,有消息循環的線程一般都會有一個Looper。事實上Android提供了一個封裝好的帶有looper的線程類,即為HandlerThread

 

四、實例1

 1 package app.com.myapplication;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Handler;
 6 import android.os.HandlerThread;
 7 import android.os.Looper;
 8 import android.os.Message;
 9 import android.widget.Toast;
10 
11 /**
12  *  Created by ${zyj} on 2016/2/15.
13  *
14  */
15 public class HandlerThreadActivity extends Activity {
16 
17     private HandlerThread handlerThread ;
18     private Handler handler;
19 
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23 
24         // 1:創建一個HandlerThread,即創建了一個包含Looper的線程。
25         handlerThread = new HandlerThread("leochin.com");
26         handlerThread.start(); //創建HandlerThread後一定要記得start()
27 
28         //2:獲取HandlerThread的Looper
29         Looper looper = handlerThread.getLooper();
30 
31         //3:創建Handler,通過Looper初始化
32         handler = new Handler(looper) {
33 
34             @Override
35             public void handleMessage(Message msg) {
36                 super.handleMessage(msg);
37                 int what = msg.what;
38                 Toast.makeText(HandlerThreadActivity.this, "hahah" + what , Toast.LENGTH_SHORT).show();
39             }
40         };
41 
42         //通過以上三步我們就成功創建HandlerThread。通過handler發送消息,就會在子線程中執行。
43         //如果想讓HandlerThread退出,則需要調用handlerThread.quit();。
44         
45         //創建一個線程發送消息
46         new ChildThread().start();
47     }
48 
49     class ChildThread extends Thread {
50         @Override
51         public void run() {
52             super.run();
53             try {
54                 //在子線程中可以做一些耗時的工作
55                 sleep( 1000 );
56                 Message message = handler.obtainMessage();
57                 message.what = 3 ;
58                 handler.sendMessage(message);
59             }catch ( Exception e ){
60 
61             }
62         }
63     }
64 }

 

實例2

 1 package app.com.myapplication;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Handler;
 6 import android.os.HandlerThread;
 7 import android.os.Looper;
 8 import android.os.Message;
 9 import android.widget.Toast;
10 
11 /**
12  *  Created by ${zyj} on 2016/2/15.
13  *  HandlerThread繼承於Thread,所以它本質就是個Thread。
14  *  與普通Thread的差別就在於,主要的作用是建立了一個線程,並且創立了消息隊列,有來自己的looper,可以讓我們在自己的線程中分發和處理消息。
15  */
16 public class HandlerThreadActivity2 extends Activity {
17 
18 
19     private MHandlerThread  mHandlerThread ;
20     private Handler handler ;
21 
22     @Override
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25 
26         // 1:創建一個HandlerThread,即創建了一個包含Looper的線程。
27         mHandlerThread = new MHandlerThread( "thisName" ) ;
28         mHandlerThread.start(); //創建HandlerThread後一定要記得start()
29 
30         //2:獲取HandlerThread的Looper
31         Looper looper = mHandlerThread.getLooper();
32 
33         //3:創建Handler,通過Looper初始化
34         //特別要注意的是handler與誰相關,不是看handler寫在什麼位置,而是看handler的looper跟什麼相關
35         handler = new Handler(looper) {
36 
37             @Override
38             public void handleMessage(Message msg) {
39                 super.handleMessage(msg);
40                 int what = msg.what;
41                 Toast.makeText(HandlerThreadActivity2.this, "hahah" + what , Toast.LENGTH_SHORT).show();
42             }
43         };
44 
45         handler.sendEmptyMessage(2) ;
46 
47     }
48 
49     class  MHandlerThread extends  HandlerThread {
50         public MHandlerThread(String name) {
51             super(name);
52         }
53     }
54 }

 

注意:寫 MHandlerThread 的時候,最好寫上線程的優選級

1  class  MHandlerThread extends  HandlerThread {
2         public MHandlerThread(String name ) {
3             //設置程序的優先級(標准後台程序)
4             super(name , Process.THREAD_PRIORITY_BACKGROUND);
5         }
6     }

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved