Android進階:2、從源碼角度看透 HandlerThread 和 IntentService 本質

上篇文章咱們講日誌的存儲策略的時候用到了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。
bash

在serviceHandler的handlerMessage方法中會調用咱們本身重寫的onHandleIntent方法,最後結束本身。
同時咱們應該也能發現,必須執行OnCreate方法這個方法纔能有效,因此啓動這個服務的方法必須是startService,而不能是bind的方式。多線程

系列性文章,若是喜歡個人文章的點個贊和關注,你的贊和關注是我前行的動力架構

最後送福利了,如今關注我而且加入羣聊能夠獲取包含源碼解析,自定義View,動畫實現,架構分享等。
內容難度適中,篇幅精煉,天天只需花上十幾分鍾閱讀便可。
你們能夠跟我一塊兒探討,歡迎加羣探討,有flutter—性能優化—移動架構—資深UI工程師 —NDK相關專業人員和視頻教學資料,還有更多面試題等你來拿~

羣號:925019412

相關文章
相關標籤/搜索