HandlerThread源碼分析

HandlerThread

顧名思義晒屎,HandlerThread它是一個(gè)Thread淫半,是Google為提高開發(fā)者效率封裝的一個(gè)類逆济。
與普通的Thread不同的是榛斯,它有一個(gè)成員屬性 Looper,而Looper是用來干嘛的前一章節(jié)我們已經(jīng)介紹過了永票。也就是說卵贱,我們的HandlerThread具有了Looper的功能。如果你有看過HandlerThread的源碼侣集,你會(huì)發(fā)現(xiàn)它非常短键俱,一百多行代碼。那世分,我們先來看線程最核心的run方法

@Override
public void run() {
    mTid = Process.myTid();
    Looper.prepare();
    synchronized (this) {
        mLooper = Looper.myLooper();
        notifyAll();
    }
    Process.setThreadPriority(mPriority);
    onLooperPrepared();
    Looper.loop();
    mTid = -1;
}

沒錯(cuò)编振,這就是我們?cè)谧泳€程里使用Handler時(shí)的典型用法
Looper.prepare(), Looper.loop()的使用臭埋,不同的是這里使用了一個(gè)鎖踪央,
synchronized我們當(dāng)前的這個(gè)類實(shí)例,并且調(diào)用notifyAll()瓢阴。為什么要多寫這個(gè)呢畅蹂?看到這里我也不曉得。
當(dāng)我們對(duì)消息隊(duì)列的處理影響到性能的時(shí)候荣恐,比如頁面上的卡頓或者比較耗時(shí)的任務(wù)液斜,那我們就可以考慮使用HandlerThread了,來看看他的用法:

private Handler mHandler;
private HandlerThread mHandlerThread;

public void initHandler() {
    mHandlerThread = new HandlerThread(Tag);
    mHandlerThread.start();
    mHandler = new Handler(mHandlerThread.getLooper());
}

我們知道叠穆,在主線程里使用Hander少漆,我們不需要再調(diào)用Looper.prepare()和Looper.loop(),因?yàn)橄到y(tǒng)已經(jīng)幫我們處理好了痹束,主線程里的Handler使用的主線程的Looper检疫。
使用HandlerThread,我們就可以在初始化Handler的時(shí)候讶请,將HandlerThread里的Looper傳遞給Handler祷嘶。這樣屎媳,主線程里Handler消息處理就會(huì)被轉(zhuǎn)移到子線程里,這樣一定程度上減少了主線程的壓力论巍。
回頭來看源碼烛谊,

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;
}

初始化時(shí)getLooper(),我們發(fā)現(xiàn),這里也有一個(gè)鎖嘉汰,也是鎖住HandlerThread類實(shí)例丹禀。start HandlerThread時(shí),會(huì)調(diào)用其run方法鞋怀,run方法里會(huì)調(diào)用 Looper.prepare() 需要一定的時(shí)間, 所以在new Handler時(shí)双泪,wait()方法等待Looper初始化完成,所以在run方法里才會(huì)有
notifyAll()的調(diào)用密似。

以上就是對(duì)HandlerThread的分析焙矛,是不是挺簡單的呢?
根據(jù)以上的分析我們可以總結(jié)出:

  1. HandlerThread將Looper轉(zhuǎn)移到子線程中處理残腌,降低主線程的壓力村斟,不會(huì)阻塞主線程,界面顯示會(huì)更流暢
  2. 子線程處理消息抛猫,因此可以處理一些比較耗時(shí)的單個(gè)任務(wù)蟆盹。
  3. 由于使用消息隊(duì)列的處理方式,故并發(fā)的多任務(wù)并不適用HandlerThread闺金,會(huì)造成嚴(yán)重的阻塞
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逾滥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掖看,更是在濱河造成了極大的恐慌匣距,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哎壳,死亡現(xiàn)場離奇詭異毅待,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)归榕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門尸红,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刹泄,你說我怎么就攤上這事外里。” “怎么了特石?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵盅蝗,是天一觀的道長。 經(jīng)常有香客問我姆蘸,道長墩莫,這世上最難降的妖魔是什么芙委? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮狂秦,結(jié)果婚禮上灌侣,老公的妹妹穿的比我還像新娘。我一直安慰自己裂问,他們只是感情好侧啼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堪簿,像睡著了一般痊乾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上椭更,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天符喝,我揣著相機(jī)與錄音,去河邊找鬼甜孤。 笑死协饲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缴川。 我是一名探鬼主播茉稠,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼把夸!你這毒婦竟也來了而线?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤恋日,失蹤者是張志新(化名)和其女友劉穎膀篮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岂膳,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡誓竿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谈截。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筷屡。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖簸喂,靈堂內(nèi)的尸體忽然破棺而出毙死,到底是詐尸還是另有隱情,我是刑警寧澤喻鳄,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布扼倘,位于F島的核電站,受9級(jí)特大地震影響除呵,放射性物質(zhì)發(fā)生泄漏再菊。R本人自食惡果不足惜隅肥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袄简。 院中可真熱鬧,春花似錦泛啸、人聲如沸绿语。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吕粹。三九已至,卻和暖如春岗仑,著一層夾襖步出監(jiān)牢的瞬間匹耕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工荠雕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稳其,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓炸卑,卻偏偏與公主長得像既鞠,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盖文,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容