HandlerThread那些事兒

前言

知識儲備:手撕Handler
面試題庫:泓洋大神等人的Github項目

雖然HandlerThread其實在我的項目中并沒有使用到過驴一,而我現(xiàn)在也是準備面試的一個階段,學(xué)的多也總是沒有壞處杈曲。

基礎(chǔ)用法

// 創(chuàng)建Handler實例
HandlerThread handlerThread  = new HandlerThread("MainActivity");
// 線程啟動
handlerThread.start();
// 基于HandlerThread構(gòu)建的Looper
Handler handler = new Handler(handlerThread.getLooper()){
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
                Log.e(TAG, msg.what+"");
            }
        };
// 使用handler發(fā)送消息
handler.sendEmptyMessage(1);
// 退出Lopper的死循環(huán)
handlerThread.quit();

揭秘HandlerThread

先看看HandlerThread的家庭里有哪些成員呢胸懈?

// 一個繼承自Thread的類
public class HandlerThread extends Thread {
    int mPriority; // 優(yōu)先級
    int mTid = -1;
    Looper mLooper; // Looper
    private @Nullable Handler mHandler; // Handler
}

主要的已經(jīng)標示出解釋,因為在之前的手撕Handler已經(jīng)比較全面的講解過了Handler以及Looper的作用涌献,這里我們應(yīng)該也能比較清晰的知道HandlerThread的組成成分應(yīng)該是Handler+Thread首有。

之前在手撕Handler的講解中枢劝,Looper指的是在ActivityThread中定義的卜壕,也就是一個全局型的Looper,并且他的初始化是如下所示的鹤盒。

Handler handler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(@NonNull Message msg) {
                return false;
            }
        });

而這個初始化函數(shù)最后調(diào)用的Looper也就是我們指的一個全局的Looper轮蜕。
下面給出這個構(gòu)造函數(shù)調(diào)用的代碼。

public Handler(@Nullable Callback callback, boolean async) {
        if (FIND_POTENTIAL_LEAKS) {
            final Class<? extends Handler> klass = getClass();
            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                    (klass.getModifiers() & Modifier.STATIC) == 0) {
                Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
                    klass.getCanonicalName());
            }
        }

        mLooper = Looper.myLooper(); // 獲得ActivityThread中初始化的Looper
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread " + Thread.currentThread()
                        + " that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

這就是HandlerThread中的Handler和上述定義的Handler的區(qū)別了,但是他們的工作原理是一致的汇竭,只是變化了Looper穴张。

使用HandlerThread的優(yōu)缺點

使用場景:單線程+異步任務(wù)場景

優(yōu)點:

  1. 將loop運行在子線程中處理,減輕了主線程的壓力,使主線程更流暢
  2. 串行執(zhí)行,開啟一個線程起到多個線程的作用
  3. 有自己的消息隊列,不會干擾UI線程

缺點:

  1. 由于每一個任務(wù)隊列逐步執(zhí)行,一旦隊列耗時過長,消息延時
  2. 對于IO等操作,線程等待,不能并發(fā)

以上就是我的學(xué)習(xí)成果,如果有什么我沒有思考到的地方或是文章內(nèi)存在錯誤皂甘,歡迎與我分享。


相關(guān)文章推薦:
手撕OkHttp
手撕AsyncTask
手撕ButterKnife
手撕Handler

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市渐夸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘟忱,老刑警劉巖苫幢,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異韩肝,居然都是意外死亡,警方通過查閱死者的電腦和手機玫氢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攻旦,“玉大人生逸,你說我怎么就攤上這事〔郯溃” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵截酷,是天一觀的道長乾戏。 經(jīng)常有香客問我,道長三幻,這世上最難降的妖魔是什么呐能? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮摆出,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荣倾。我一直安慰自己骑丸,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布铸豁。 她就那樣靜靜地躺著菊碟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚣驼,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天相艇,我揣著相機與錄音,去河邊找鬼坛芽。 笑死,一個胖子當著我的面吹牛获讳,可吹牛的內(nèi)容都是我干的活喊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼尤误,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起软棺,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤喘落,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘦棋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年赡若,在試婚紗的時候發(fā)現(xiàn)自己被綠了团甲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡身腻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘀趟,到底是詐尸還是另有隱情,我是刑警寧澤去件,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布尤溜,位于F島的核電站,受9級特大地震影響宫莱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巡验,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一碘耳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辛辨,春花似錦、人聲如沸斗搞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虑啤。三九已至,卻和暖如春驶鹉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背室埋。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孕蝉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓降淮,卻偏偏與公主長得像搏讶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子系吩,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • 異步消息處理線程啟動后會進入一個無限的循環(huán)體之中妒蔚,每循環(huán)一次,從其內(nèi)部的消息隊列中取出一個消息科盛,然后回調(diào)相應(yīng)的消息...
    cxm11閱讀 6,425評論 2 39
  • Activity是什么 Activity是四大組件之一菜皂,它提供一個界面讓用戶點擊和各種滑動操作 Activity棧...
    叫我吹神閱讀 2,647評論 0 4
  • 一、提出問題 面試時常被問到的問題: 簡述 Android 消息機制 Android 中 Handler但壮,Loop...
    崽子豬閱讀 1,523評論 0 10
  • Handler是非常頻繁使用于各種通信的一種工具常侣,HandlerThread則是比較少用弹渔,但是二者之間具有一定...
    熠閑閱讀 1,793評論 0 0
  • 這是我近段時間收集的面試題,獻給打算年后找工作的同學(xué)們肢专。文中涉及的知識比較廣也可能比較零散,并且一些較為基礎(chǔ)的知識...
    01_小小魚_01閱讀 894評論 0 35