IntentService可用于執(zhí)行耗時的,高優(yōu)先級的后臺任務(wù),封裝了Handlerthread和Handler
源碼分析
oncreate():
第一次創(chuàng)建intentservice的時候,會執(zhí)行一次oncreate方法
@Override
public void onCreate() {
// TODO: It would be nice to have an option to hold a partial wakelock
// during processing, and to have a static startService(Context, Intent)
// method that would launch the service & hand off a wakelock.
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
在oncreate方法里,會創(chuàng)建HandlerThread,這個類主要作用我們后邊說,先來看一下HandlerThread里面都做了哪些東西??主要是看它的run方法,HandlerThread類和一般的thread類區(qū)別就在于,它的run方法里面創(chuàng)建了looper。而且IntentService通過looper,創(chuàng)建了handler。這樣的話,intentservice通過handler發(fā)送消息,最后會在handlerthread中處理。
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
onStartCommand
intentservice會在onstartcommand中處理外界給的intent,會接著調(diào)用onstart方法
@Override
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
/**
* You should not override this method for your IntentService. Instead,
* override {@link #onHandleIntent}, which the system calls when the IntentService
* receives a start request.
* @see android.app.Service#onStartCommand
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
這個可以看出來,非常簡單,只是通過handler發(fā)送了一條消息,會進(jìn)入handlerthread的looper,這時候又是涉及到了線程切換 。這塊怎么講呢???以前以為類在哪個線程創(chuàng)建,這個類以及這個類的方法,就屬于哪個線程,這個是極其錯誤的想法,應(yīng)該是這個類的方法,被哪個線程調(diào)用了,這個方法就屬于哪個線程。這么一看的話。
intentservice發(fā)送了消息,然后通過HandlerThread的looper進(jìn)入到HandlerThread線程,而這個線程里面的looper又會調(diào)用,handler的handlemessage,進(jìn)而調(diào)用onHandleIntent方法。這時候耗時任務(wù),就相當(dāng)于是在onHandleIntent類里面調(diào)用的。從而達(dá)到了切換線程的操作。
Android中的線程池
線程池的優(yōu)點:
(1)重用線程池里面的線程,避免創(chuàng)建和銷毀線程帶來的性能開銷
(2)能有效控制線程池的最大并發(fā)數(shù),避免大量線程之間因為互相搶占系統(tǒng)資源而導(dǎo)致阻塞
(3)能夠?qū)€程進(jìn)行簡單的管理,并提供定時執(zhí)行以及制定間隔循環(huán)執(zhí)行等功能
ThreadPoolExecutor
(1)線程池中線程數(shù)量未達(dá)到核心線程數(shù)量,就會直接啟動核心線程
(2)如果線程數(shù)量已經(jīng)或者超過核心線程數(shù)量,那么就會排隊等待
(3)如果沒辦法將任務(wù)插入到任務(wù)隊列,這時候未達(dá)到線程池該規(guī)定的最大值,那么就會啟動一個非核心線程
(4)如果線程數(shù)量達(dá)到線程池規(guī)定的最大值,那么就拒絕執(zhí)行此任務(wù)。