一、概念
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 @Override21 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的Looper29 Looper looper = handlerThread.getLooper();30 31 //3:创建Handler,通过Looper初始化32 handler = new Handler(looper) {33 34 @Override35 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 @Override51 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 @Override23 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的Looper31 Looper looper = mHandlerThread.getLooper();32 33 //3:创建Handler,通过Looper初始化34 //特别要注意的是handler与谁相关,不是看handler写在什么位置,而是看handler的looper跟什么相关35 handler = new Handler(looper) {36 37 @Override38 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 }