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來執行了。ide

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。oop

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

寫在最後
不少人在剛接觸這個行業的時候或者是在遇到瓶頸期的時候,總會遇到一些問題,好比學了一段時間感受沒有方向感,不知道該從那裏入手去學習,對此我整理了一些資料,須要的能夠免費分享給你們學習

若是喜歡個人文章,想與一羣資深開發者一塊兒交流學習的話,歡迎加入個人合做羣Android Senior Engineer技術交流羣:925019412this

領取方式:Android技術交流羣925019412線程

相關文章
相關標籤/搜索