1. 程式人生 > >Android進階:二、從源碼角度看透 HandlerThread 和 IntentService

Android進階:二、從源碼角度看透 HandlerThread 和 IntentService

pri vat thread err 應該 red service adp 結束

上篇文章我們講日誌的存儲策略的時候用到了HandlerThread,它適合處理“多而小的任務”的耗時任務的時候,避免產生太多線程影響性能,那這個HandlerThread的原理到底是怎樣的呢?我們現在從源碼角度解讀

  • HandlerThread:繼承自Thread,是一個可以使用Handler的Thread。因為在run方法內維護了一個Looper,可以通過Handler發送消息的方式,來通知HandlerThread執行一個具體的任務。
public void run() {
        mTid = Process.myTid();
        Looper.prepare();
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();
        mTid = -1;
    }
  • IntentService是HandlerThread的一個具體的使用場景。首先內部封裝了一個ServiceHandler
private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }

在Service的onCreate()方法中實例化了一個ServiceHandler的對象:

HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();
        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);

實例化ServiceHandler對象的時候首先實例化一個HandlerThread,然後用HandlerThread對象的Looper實例化這個ServiceHandler,達到將兩者綁定的目的,這樣就可以通過ServiceHandler發送事件通知HandlerThread來執行了。

public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

我們看到在onStart方法中,把Intent傳到msg中,然後使用serviceHandler發送消息給HandlerThread。

在serviceHandler的handlerMessage方法中會調用我們自己重寫的onHandleIntent方法,最後結束自己。
同時我們應該也能發現,必須執行OnCreate方法這個方法才能有效,所以啟動這個服務的方法必須是startService,而不能是bind的方式。

Android進階:二、從源碼角度看透 HandlerThread 和 IntentService