HandlerThread那些事兒

前言

知識(shí)儲(chǔ)備:手撕Handler
面試題庫(kù):泓洋大神等人的Github項(xiàng)目

雖然HandlerThread其實(shí)在我的項(xiàng)目中并沒(méi)有使用到過(guò),而我現(xiàn)在也是準(zhǔn)備面試的一個(gè)階段,學(xué)的多也總是沒(méi)有壞處。

基礎(chǔ)用法

// 創(chuàng)建Handler實(shí)例
HandlerThread handlerThread  = new HandlerThread("MainActivity");
// 線程啟動(dòng)
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的家庭里有哪些成員呢?

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

主要的已經(jīng)標(biāo)示出解釋,因?yàn)樵谥暗?a href="http://www.itdecent.cn/p/f0cb15862eb4" target="_blank">手撕Handler已經(jīng)比較全面的講解過(guò)了Handler以及Looper的作用,這里我們應(yīng)該也能比較清晰的知道HandlerThread的組成成分應(yīng)該是Handler+Thread。

之前在手撕Handler的講解中,Looper指的是在ActivityThread中定義的,也就是一個(gè)全局型的Looper,并且他的初始化是如下所示的。

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

而這個(gè)初始化函數(shù)最后調(diào)用的Looper也就是我們指的一個(gè)全局的Looper。
下面給出這個(gè)構(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)缺點(diǎn)

使用場(chǎng)景:?jiǎn)尉€程+異步任務(wù)場(chǎng)景

優(yōu)點(diǎn):

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

缺點(diǎn):

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

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


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容