使用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給幹掉。中斷當前處理的操做,後續任何發送到消息隊列的消息都無效。隊列

相關文章
相關標籤/搜索