上篇文章咱們講日誌的存儲策略的時候用到了HandlerThread,它適合處理「多而小的任務」的耗時任務的時候,避免產生太多線程影響性能,那這個HandlerThread的原理究竟是怎樣的呢?咱們如今從源碼角度解讀:【文章底有資料領取】
public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; }
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線程