Android HandlerThread簡單使用

HandlerThread簡介

HandlerThread繼承了Thread赴邻,它是一種可以使用Handler的Thread违崇,它的實(shí)現(xiàn)就是在run()方法中通過Looper.prepare()創(chuàng)建消息隊(duì)列寨蹋,并通過Looper.loop()開啟消息循環(huán)兴想。這樣在實(shí)際使用中就允許在HandlerThread中創(chuàng)建Handler了斩例。
由于HandlerThread的run()方法是一個(gè)無限循環(huán)吼具,因此當(dāng)明確不需要使用HandlerThread的時(shí)候可以通過Looper的quit()或quitSafely()來終止線程執(zhí)行僚纷。

使用Handler

通常我們會(huì)在主線程中創(chuàng)建Handler,在子線程中調(diào)用handler.post(runnable)傳遞消息到主線程的消息隊(duì)列中處理runnable的run方法.這樣完成了子線程到主線的切換拗盒。
在onCreate()方法中

mainHandler = new Handler();

然后在子線程中post

btn_post_to_main_thread.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "Thread id = " + Thread.currentThread().getId());
                mainHandler.post(runnable);
            }
        }).start();
                
    }
});

runnable

    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            Log.d(TAG, "Thread id = " + Thread.currentThread().getId());
        }
    };

運(yùn)行結(jié)果

HandlerThreadActivity: Thread id = 10383
HandlerThreadActivity: Thread id = 1

使用HandlerThread

先創(chuàng)建HandlerThread實(shí)例怖竭,在onCreate()方法中

handlerThread = new HandlerThread("handlerThread");
handlerThread.start();

這樣就開啟了一個(gè)帶Looper的子線程,因?yàn)镠andlerThread是繼承自Thread锣咒,它的run方法是這樣定義的

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

關(guān)于Looper原理侵状,可以參考《Android開發(fā)藝術(shù)探索》中的消息機(jī)制,我的理解是:

  • Looper.prepare();創(chuàng)建Looper實(shí)例
  • Looper.loop();進(jìn)入一個(gè)無限循環(huán)中毅整,不斷監(jiān)聽消息隊(duì)列中是否有消息趣兄,有則把他取出來分發(fā)給handler的handlerMessage()中處理。

因?yàn)榫€程中需要有一個(gè)Looper悼嫉,線程綁定的handler才可以發(fā)送消息到消息隊(duì)列中艇潭,那么相應(yīng)的線程才會(huì)得到處理。

然后就是利用handlerThread獲取到Looper用來創(chuàng)建Handler實(shí)例

handler = new Handler(handlerThread.getLooper());

此時(shí)這個(gè)handler即使實(shí)在主線程中創(chuàng)建,但是它與子線程的Looper關(guān)聯(lián)了蹋凝,所以處理消息時(shí)候也會(huì)在子線程中處理的

btn_post_to_sub_thread.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handler.post(runnable);
    }
});

運(yùn)行結(jié)果:

HandlerThreadActivity: Thread id = 10382
HandlerThreadActivity: Thread id = 10382
HandlerThreadActivity: Thread id = 10382

可以知道是在子線程中處理的鲁纠。

HandlerThread和Thread的區(qū)別

  • 普通Thread主要用于在run()方法中執(zhí)行一個(gè)耗時(shí)的任務(wù)
  • HandlerThread內(nèi)部創(chuàng)建消息隊(duì)列,需要handler消息方式來通知HandlerThread去執(zhí)行一個(gè)具體的任務(wù)鳍寂。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末改含,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子迄汛,更是在濱河造成了極大的恐慌捍壤,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞍爱,死亡現(xiàn)場離奇詭異鹃觉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睹逃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門盗扇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沉填,你說我怎么就攤上這事疗隶。” “怎么了拜轨?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵抽减,是天一觀的道長。 經(jīng)常有香客問我橄碾,道長卵沉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任法牲,我火速辦了婚禮史汗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拒垃。我一直安慰自己停撞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布悼瓮。 她就那樣靜靜地躺著戈毒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪横堡。 梳的紋絲不亂的頭發(fā)上埋市,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機(jī)與錄音命贴,去河邊找鬼道宅。 笑死食听,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的污茵。 我是一名探鬼主播樱报,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泞当!你這毒婦竟也來了迹蛤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤襟士,失蹤者是張志新(化名)和其女友劉穎笤受,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敌蜂,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年津肛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了章喉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡身坐,死狀恐怖秸脱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情部蛇,我是刑警寧澤摊唇,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站涯鲁,受9級(jí)特大地震影響巷查,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抹腿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一岛请、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧警绩,春花似錦崇败、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至混狠,卻和暖如春岸霹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背檀蹋。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工松申, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留云芦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓贸桶,卻偏偏與公主長得像舅逸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子皇筛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361

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