對HandlerThread的理解

提示:閱讀本文之前可先閱讀Android個人筆記之Android的消息機制

HandlerThread本質(zhì)上就是一個普通Thread,只不過內(nèi)部建立了Looper.看下源碼

public class HandlerThread extends Thread {
    int mPriority;
    int mTid = -1;
    Looper mLooper;

    public HandlerThread(String name) {
        super(name);
        mPriority = Process.THREAD_PRIORITY_DEFAULT;
    }
    

    public HandlerThread(String name, int priority) {
        super(name);
        mPriority = priority;
    }
    

    protected void onLooperPrepared() {
    }

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

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

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

    /**
     * Returns the identifier of this thread. See Process.myTid().
     */
    public int getThreadId() {
        return mTid;
    }
}

由此看出HandlerThread除了有個優(yōu)先級之外,與自己手動創(chuàng)建Looper的Thread并沒有什么不同锉走。這里有一個地方要理解一下锣险,也許你已經(jīng)發(fā)現(xiàn)了
run方法里面當(dāng)mLooper創(chuàng)建完成后有個notifyAll(),getLooper()中有個wait()勤篮,這是為什么呢?因為mLooper在HandlerThread中執(zhí)行,而我們的handler是在UI線程初始化的庐冯,也就是說,我們必須等到mLooper創(chuàng)建完成沿盅,才能正確的返回getLooper();wait(),notify()就是為了解決這兩個線程的同步問題把篓。

既然系統(tǒng)給我們提供了這么一個類,到底有什么好處呢腰涧?

HandlerThread的常規(guī)用法

  • 啟動線程韧掩,構(gòu)造參數(shù):String代表線程名,priority代表優(yōu)先級窖铡。優(yōu)先級范圍為-20到19疗锐,默認(rèn)為0,優(yōu)先級越高费彼,獲得的CPU資源更多滑臊,反之則越少。-20代表優(yōu)先級最高箍铲,反之19最低雇卷。
mThread = new HandlerThread("handler_thread"); 
mThread.start();
  • 創(chuàng)建處理任務(wù)的mWorkHandler和更新UI的mUIHandler。
mWorkHandler = new Handler(mThread.getLooper());
mUIHandler = new Handler();
  • mWorkHandler與HandlerThread的Looper關(guān)聯(lián),并在handleMessage(Message msg)中處理任務(wù)颠猴,處理完之后通知mUIHandler對UI進行刷新关划。
  • 在合適的時機退出HandlerThread,比如activity中的onDestroy(),方法有quit()和quitSafely()

具體處理方式要看具體需求,不過總體思路跟上面三個步驟差不多翘瓮。如果想處理多個任務(wù)贮折。就發(fā)送多個消息,在mWorkHandler進行處理资盅。

HandlerThread的特點

  • HandlerThread將loop轉(zhuǎn)到子線程中處理调榄,說白了就是將分擔(dān)MainLooper的工作量,降低了主線程的壓力呵扛,使主界面更流暢每庆。
  • 開啟一個線程起到多個線程的作用。處理任務(wù)是串行執(zhí)行今穿,按消息發(fā)送順序進行處理扣孟。
    相比多次使用new Thread(){…}.start()這樣的方式節(jié)省系統(tǒng)資源。
    但是由于每一個任務(wù)都將以隊列的方式逐個被執(zhí)行到荣赶,一旦隊列中有某個任務(wù)執(zhí)行時間過長凤价,那么就會導(dǎo)致后續(xù)的任務(wù)都會被延遲處理。
  • HandlerThread擁有自己的消息隊列拔创,它不會干擾或阻塞UI線程利诺。
  • 通過設(shè)置優(yōu)先級就可以同步工作順序的執(zhí)行,而又不影響UI的初始化剩燥;

總結(jié)

HandlerThread比較適用于單線程+異步隊列的場景慢逾,比如IO讀寫操作立倍,耗時不多而且也不會產(chǎn)生較大的阻塞。對于網(wǎng)絡(luò)IO操作侣滩,HandlerThread并不適合口注,因為它只有一個線程,還得排隊一個一個等著君珠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寝志,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子策添,更是在濱河造成了極大的恐慌材部,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唯竹,死亡現(xiàn)場離奇詭異乐导,居然都是意外死亡,警方通過查閱死者的電腦和手機浸颓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門物臂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人产上,你說我怎么就攤上這事棵磷。” “怎么了蒂秘?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵泽本,是天一觀的道長淘太。 經(jīng)常有香客問我姻僧,道長,這世上最難降的妖魔是什么蒲牧? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任撇贺,我火速辦了婚禮,結(jié)果婚禮上冰抢,老公的妹妹穿的比我還像新娘松嘶。我一直安慰自己,他們只是感情好挎扰,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布翠订。 她就那樣靜靜地躺著,像睡著了一般遵倦。 火紅的嫁衣襯著肌膚如雪尽超。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天梧躺,我揣著相機與錄音似谁,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛巩踏,可吹牛的內(nèi)容都是我干的秃诵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼塞琼,長吁一口氣:“原來是場噩夢啊……” “哼菠净!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屈梁,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤嗤练,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后在讶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煞抬,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年构哺,在試婚紗的時候發(fā)現(xiàn)自己被綠了革答。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡曙强,死狀恐怖残拐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碟嘴,我是刑警寧澤溪食,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站娜扇,受9級特大地震影響错沃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雀瓢,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一枢析、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刃麸,春花似錦醒叁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吁伺,卻和暖如春饮睬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背箱蝠。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工续捂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垦垂,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓牙瓢,卻偏偏與公主長得像劫拗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矾克,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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