Android HandlerThread

Handler

Android 中負(fù)責(zé)發(fā)送和處理消息,通過它可以實現(xiàn)不同線程之間的消息通信。

每個 Handler 都需要綁定一個 Looper 來管理消息隊列和消息循環(huán)。

Activity 被創(chuàng)建時就默認(rèn)創(chuàng)建了 Looper,所以在主線程中默認(rèn)可以直接使用 Handler。這時 Handler 綁定的是 ActivityLooper
當(dāng)然也可以設(shè)置其他的 Looper,如果沒有指定 Looper,默認(rèn)使用 new Handler() 時線程所持有的 Looper。
如果當(dāng)前線程沒有創(chuàng)建 Looper,就會報錯。

Android Handler 總結(jié)

HandlerThread

HandlerThread 繼承自 Thread,本質(zhì)就是個 Thread
其與普通 Thread 的區(qū)別在于實現(xiàn)了自己的 Looper,可以單獨分發(fā)和處理消息。

用來實現(xiàn)線程間的通信,主要是子線程和子線程間的通信。 Handler 更多的主要是子線程到主線程。

HandlerThread 的使用

有時候需要 Handler 收到消息時,在子線程處理消息。如果每次都通過 new Thread() 的方式來新開一個子線程,會浪費資源,增加系統(tǒng)開銷。

Handler 可以指定 Looper,但是需要自己處理 Looper 會比較麻煩,所以谷歌封裝了 HandlerThread 類。
類似的類有 AsyncTask。

HandlerThread 處理任務(wù)是串行執(zhí)行,按消息發(fā)送順序進(jìn)行處理。

1. 創(chuàng)建

private HandlerThread mHandlerThread;
......
mHandlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();

HandlerThread 在調(diào)用 start() 方法之后,就可以獲取到子線程的 Looper。

2. Handler 中使用 mHandlerThread.getLooper()

mHandler = new Handler(mHandlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                System.out.println("收到消息 : " + Thread.currentThread());
            }
        };

mHandler 指定 mHandlerThread 線程中的 Looper

3. 在子線程使用 mHandler 發(fā)送消息,mHandler 中接收和處理消息(也是非 UI 線程)

 new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(1000);//模擬耗時操作
                            System.out.println("發(fā)送消息 : " + Thread.currentThread());
                            mHandler.sendEmptyMessage(0);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();

4. 釋放

@Override
    protected void onDestroy() {
        super.onDestroy();
        if (mHandlerThread != null) {
            mHandlerThread.quitSafely();
        }
    }

運行后的打印:

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

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

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