使用HandlerThread时遇到的问题

相比于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给干掉。中断当前处理的操做,后续任何发送到消息队列的消息都无效。队列

相关文章
相关标签/搜索