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     }

 

你可能感兴趣的:(HandlerThread)