相比于AsyncTask,HandlerThread更好操控一些,由于当须要中断异步操做的时候例如:退出activity,屏幕旋转等等,虽然AsyncTask提供了中断的方法cancle( );有时候会失效,java
从源码能够看出,它调用的是interrupt( )方法,有必要说一下java中的中断机制,Java中断机制是一种协做机制,也就是说经过中断并不能直接终止另外一个线程,而须要被中断的线程本身处理中断。当调用interrupt()方法的时候,只是设置了要中断线程的中断状态。既然不能直接中断线程,那只好经过暴力方式中断了。异步
HandlerThread的使用ide
HandlerThread handlerThread = new HandlerThread("your tag"); handlerThread.start(); Looper looper = handlerThread.getLooper(); Handler handler=new Handler(looper); { @Override public void handleMessage(Message msg) { if (msg.what == 0) { //可执行耗时操做 } } } handler.sendEmptyMessage(0);
以上是使用HandlerThread的步骤,先建立HandlerThread对象,执行,再获取looper对象,建立Handler对象,传入looper,在handler里面重写handleMessage方法,里面可执行耗时操做,最后记得让handler发送message,根据message里面的字段来执行handleMessage方法相应的代码块。oop
下面是我实际开发中遇到的问题,大概功能是开一个子线程,读取全部联系人的电话号码,而后把结果到一个list中。ui
handlerThread = new HandlerThread("getContents"); mHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub changeData(phoneNumList); } }; handlerThread.start(); Looper looper = handlerThread.getLooper(); final Handler mHandler1 = new Handler(looper) { @Override public void handleMessage(Message msg) { if (msg.what == UPDATE) { GetContentsUtil.init(mContext); phoneNumList = GetContentsUtil.getPhoneNumList(); mHandler.sendEmptyMessage(0); } } }; mHandler1.sendEmptyMessage(UPDATE);
其中这里的handlerThread和mHandler对象是activity私有的spa
这里为何会有两个Handler呢?首先第一个mHandler1对应的域是子线程,执行耗时操做,获取数据以后你要更新啊,可是安卓里面只能在UI线程里面更新数据啊,很简单,再建立一个mHandler(mHandler是activity私有的,对应的域天然是UI线程),发送一个信号给它,而后更新UI的代码放在这个就能够了。线程
以前说到HandlerThread暴力中断,如今回归正题,code
@Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); // 销毁acitivity时销毁子线程 try { handlerThread.getLooper().quit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } handlerThread = null; }
在activity销毁的时候调用,
对象
直接把looper给干掉。中断当前处理的操做,后续任何发送到消息队列的消息都无效。队列