Android進階:二、從源碼角度看透 HandlerThread 和 IntentService
阿新 • • 發佈:2019-04-23
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