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