HandleThread集成Thread,它是一種可以使用handle的Thread,它在run方法中通過Looper.prepare()來創建一個消息隊列,並通過Looper.loop(),來開啓消息循環。
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
HandleThread與普通Thread的不同之處,普通Thread是在run方法中執行耗時操作,而HandleThread創建了消息隊列,外界可以通過Handle的消息方式執行一個具體的任務。HandleThread的run方法是一個無限循環,當不需要使用時,可以通過quit或者quitSafely來終止程序的執行。
HandleThread的使用場景以及好處:
1.在需要重複使用子線程處理任務時,可以使用HandlerThread,它自帶Looper使他可以通過消息來多次重複使用當前線程,節省開支,如果在開發中多次使用類似new Thread(){…}.start(),這種方式開啓一個子線程,會創建多個匿名線程,使得程序運行變慢。
2.在非UI線程使用消息機制,可以使用HandlerThread,它不會干擾或阻塞UI線程(android系統提供的Handler類內部的Looper默認綁定的是UI線程的消息隊列)
HandleThread的具體應用場景體現在IntentService中,可以參照我的下一篇文章IntentService,這裏簡單的寫一個使用的例子,基本可以安照UI線程的Handle的使用方法使用:
public class HandleThreadActivity extends Activity {
private static final String Tag = "HandleThreadActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
HandlerThread mHandlerThread = new HandlerThread("test");
mHandlerThread.start();
Looper mLooper = mHandlerThread.getLooper();
Handler mHandler = new Handler(mLooper) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int value = msg.what;
Log.i(Tag, "value====" + value);
}
};
mHandler.sendEmptyMessage(2);
}
}