Android-HandlerThread簡單使用

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/devallever/article/details/78413026

HandlerThread簡介

HandlerThread繼承了Thread,它是一種可以使用Handler的Thread,它的實現就是在run()方法中通過Looper.prepare()創建消息隊列,並通過Looper.loop()開啓消息循環。這樣在實際使用中就允許在HandlerThread中創建Handler了。
由於HandlerThread的run()方法是一個無限循環,因此當明確不需要使用HandlerThread的時候可以通過Looper的quit()或quitSafely()來終止線程執行。

使用Handler

通常我們會在主線程中創建Handler,在子線程中調用handler.post(runnable)傳遞消息到主線程的消息隊列中處理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());
        }
    };

運行結果

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

使用HandlerThread

先創建HandlerThread實例,在onCreate()方法中

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

這樣就開啓了一個帶Looper的子線程,因爲HandlerThread是繼承自Thread,它的run方法是這樣定義的

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

關於Looper原理,可以參考《Android開發藝術探索》中的消息機制,我的理解是:

  • Looper.prepare();創建Looper實例
  • Looper.loop();進入一個無限循環中,不斷監聽消息隊列中是否有消息,有則把他取出來分發給handler的handlerMessage()中處理。

因爲線程中需要有一個Looper,線程綁定的handler纔可以發送消息到消息隊列中,那麼相應的線程纔會得到處理。

然後就是利用handlerThread獲取到Looper用來創建Handler實例

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

此時這個handler即使實在主線程中創建,但是它與子線程的Looper關聯了,所以處理消息時候也會在子線程中處理的

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

運行結果:

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

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

HandlerThread和Thread的區別

  • 普通Thread主要用於在run()方法中執行一個耗時的任務
  • HandlerThread內部創建消息隊列,需要handler消息方式來通知HandlerThread去執行一個具體的任務。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章