上篇文章咱們講日誌的存儲策略的時候用到了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來執行了。
性能優化
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的方式。多線程
系列性文章,若是喜歡個人文章的點個贊和關注,你的贊和關注是我前行的動力架構