除了傳統(tǒng)的Thread外,還包含AsyncTask,HandlerThread,以及IntentService。
1.AsyncTask:封裝了線程池和Handler,它主要是為了方便開發(fā)者在子線程中更新UI。
AsyncTask的類必須在主線程中加載,這就意味著第一次訪問AsyncTask必須發(fā)生在主線程,當(dāng)然這個(gè)果然在Android4.1及以上版本中已經(jīng)被系統(tǒng)自動完成。在Android5.0的源碼中,可以查看ActivityThread的main方法,它會調(diào)用AsyncTask的init方法,這就滿足了AsyncTask的類必須在主線程中進(jìn)行加載這個(gè)條件了。
AsyncTask的類必須在主線程中創(chuàng)建。
execute方法必須在UI線程調(diào)用。
不要在程序中直接調(diào)用onPreExecute(),onPostExecute,doInBackground和onProgressUpdate()方法。
一個(gè)AsyncTask對象只能執(zhí)行一次,即只能調(diào)用一次execute方法,否則會報(bào)運(yùn)行時(shí)異常。
注意:在Android1.6之前,AsyncTask是串行執(zhí)行任務(wù)的,Android1.6的時(shí)候AsyncTask開始采用線程池處理并行任務(wù)。但是Android3.0開始,為了避免AsyncTask所帶來的并發(fā)錯誤,AsyncTask又采用一個(gè)線程來串行執(zhí)行任務(wù)。盡管如此,在Android3.0以及以后的版本中,仍然可以通過AsyncTask的executeOnExecutor()(此方法是Android3.0之后新添加的方法)方法來并行的執(zhí)行任務(wù)。
AsyncTask對THREAD_POOL_EXECUTOR這個(gè)線程池的配置如下:
*核心線程數(shù)等于CPU核心數(shù)+1;
*線程池的最大線程數(shù)為CPU核心數(shù)的2倍+1;
*核心線程無超時(shí)機(jī)制,非核心線程在閑置時(shí)的超時(shí)時(shí)間為1秒;
*任務(wù)隊(duì)列的容量為128;
2.HandlerThread:是一種具有消息循環(huán)的線程,在它的內(nèi)部可以使用Handler。
它的實(shí)現(xiàn)很簡單,就是在run方法中通過Looper.prepare()來創(chuàng)建消息隊(duì)列,并通過Looper.loop()來開啟消息循環(huán),這樣在實(shí)際的使用中就允許在HandlerThread中創(chuàng)建Handler了,外界需要通過Handler的消息方法來通知HandlerThread執(zhí)行一個(gè)具體的任務(wù)。由于HandlerThread的run方法是一個(gè)無限循環(huán),因此當(dāng)明確不需要再使用HandlerThread時(shí),可以通過它的quit或者quitSafely方法來終止線程的執(zhí)行。
3.IntentService:是一個(gè)服務(wù),系統(tǒng)對其進(jìn)行了封裝使其可以更方便的執(zhí)行后臺任務(wù),IntentService內(nèi)部采用HandlerThread來執(zhí)行任務(wù),當(dāng)任務(wù)執(zhí)行完畢后IntentService會自動退出。從任務(wù)執(zhí)行的角度來看,IntentService的作用很想一個(gè)后臺線程,但是IntentService是一種服務(wù),它不容易被系統(tǒng)殺死從而可以盡量保證任務(wù)的執(zhí)行,而如果是一個(gè)后臺線程,由于這個(gè)時(shí)候進(jìn)程中沒有活動的四大組件,那么這個(gè)進(jìn)程的優(yōu)先級就會非常低,會很容易被系統(tǒng)殺死,這就是IntentService的優(yōu)點(diǎn)。
它繼承了Service并且是一個(gè)抽象類,因此必須創(chuàng)建它的子類才能使用IntentService。需要實(shí)現(xiàn)onHandleIntent方法。
當(dāng)任務(wù)執(zhí)行后它會自動停止。
IntentService中的任務(wù)是串行排隊(duì)執(zhí)行的。