1负甸、HandlerThread 是什么妆毕?
它繼承至 Thread慎玖,具備線(xiàn)程的特性。它是一個(gè)帶有 Looper 的線(xiàn)程笛粘,并且該Looper可以被用于創(chuàng)建對(duì)應(yīng)的Handler趁怔。
2、HandlerThread的作用是什么薪前?
當(dāng)一個(gè)線(xiàn)程執(zhí)行完一個(gè)耗時(shí)任務(wù)之后润努,如果想要再執(zhí)行另外一個(gè)耗時(shí)任務(wù)那么就需要重新創(chuàng)建一個(gè)新的線(xiàn)程,而多次進(jìn)行線(xiàn)程的開(kāi)啟和銷(xiāo)毀的是需要很大的開(kāi)銷(xiāo)示括。在一般情況下铺浇,線(xiàn)程被開(kāi)啟之后,也就是run方法會(huì)被執(zhí)行垛膝,若需要?jiǎng)討B(tài)地在執(zhí)行過(guò)程做一些其它處理鳍侣,例如根據(jù)不同的條件執(zhí)行不同的代碼塊,顯然是比較麻煩的吼拥。而HandlerThread解決了這個(gè)問(wèn)題倚聚,它內(nèi)部維護(hù)了一個(gè)Looper不斷地去輪訓(xùn)消息隊(duì)列,當(dāng)需要在子線(xiàn)程做其他操作時(shí)扔罪,只需要通過(guò)綁定的Handler去發(fā)送消息秉沼,然后處理即可。
3、HandlerThread的工作原理
HandlerThread 是一個(gè)內(nèi)部維護(hù)一個(gè) Looper 對(duì)象的線(xiàn)程唬复。這樣就省去了創(chuàng)建線(xiàn)程時(shí)需要手動(dòng)的創(chuàng)建 Looper 的麻煩矗积。而已它內(nèi)部使用了
wait() 和 notifyAll() 保證的 Looper 的非空性控制。
3.1敞咧、HandlerThread#run()
- 該方法是一個(gè)loop()的死循環(huán)棘捣,等待消息的到來(lái)。
- Looper.prepare()創(chuàng)建Looer對(duì)象并保存到ThreadLocal中休建。
- Looper.myLooper()獲取通過(guò)preparen()保存的Looper對(duì)象乍恐。
- loop()開(kāi)啟輪訓(xùn)器輪訓(xùn)。
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
//在這里的 Looper 已經(jīng)創(chuàng)建完畢测砂,通知 getLooper 不需要等待啦茵烈。
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();//空的回調(diào),交由用戶(hù)做一些loop()前的準(zhǔn)備工作砌些。
Looper.loop();
mTid = -1;
}
3.2呜投、HandlerThread#getLooper()
獲取關(guān)聯(lián)的Looper對(duì)象,可用于外部創(chuàng)建Handler的構(gòu)造參數(shù)存璃,該方法中有一個(gè)wait()方法仑荐,然后在run()中一個(gè)notifyAll()方法,他們的作用就是在getLooper時(shí)為了保證能正確的獲取到當(dāng)looper對(duì)象纵东,當(dāng)looper為null粘招,就讓其等待,直到run()方法創(chuàng)建了其Looper對(duì)象之后調(diào)用notifyAll喚醒偎球。
public Looper getLooper() {
if (!isAlive()) {
return null;
}
// If the thread has been started, wait until the looper has been created.
synchronized (this) {
while (isAlive() && mLooper == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
return mLooper;
}
3.3洒扎、移除消息隊(duì)列中的消息
//立即退出
public boolean quit() {
Looper looper = getLooper();
if (looper != null) {
looper.quit();
return true;
}
return false;
}
//安全的退出
public boolean quitSafely() {
Looper looper = getLooper();
if (looper != null) {
looper.quitSafely();
return true;
}
return false;
}
4、 IntentService 內(nèi)部 HandlerThread 的應(yīng)用
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
//開(kāi)啟線(xiàn)程
thread.start();
//getLooper 是一個(gè)阻塞方法甜橱。
mServiceLooper = thread.getLooper();
//Handler 綁定一個(gè)通過(guò) HandlerThread 創(chuàng)建的 looper 對(duì)象逊笆。
mServiceHandler = new ServiceHandler(mServiceLooper);
}