除了傳統(tǒng)的Thread外,還包含AsyncTask拢切,HandlerThread,以及IntentService同欠。
1.AsyncTask:封裝了線(xiàn)程池和Handler样傍,它主要是為了方便開(kāi)發(fā)者在子線(xiàn)程中更新UI。
AsyncTask的類(lèi)必須在主線(xiàn)程中加載铺遂,這就意味著第一次訪問(wèn)AsyncTask必須發(fā)生在主線(xiàn)程衫哥,當(dāng)然這個(gè)果然在Android4.1及以上版本中已經(jīng)被系統(tǒng)自動(dòng)完成。在Android5.0的源碼中襟锐,可以查看ActivityThread的main方法撤逢,它會(huì)調(diào)用AsyncTask的init方法,這就滿(mǎn)足了AsyncTask的類(lèi)必須在主線(xiàn)程中進(jìn)行加載這個(gè)條件了粮坞。
AsyncTask的類(lèi)必須在主線(xiàn)程中創(chuàng)建蚊荣。
execute方法必須在UI線(xiàn)程調(diào)用。
不要在程序中直接調(diào)用onPreExecute()莫杈,onPostExecute互例,doInBackground和onProgressUpdate()方法。
一個(gè)AsyncTask對(duì)象只能執(zhí)行一次筝闹,即只能調(diào)用一次execute方法媳叨,否則會(huì)報(bào)運(yùn)行時(shí)異常。
注意:在Android1.6之前关顷,AsyncTask是串行執(zhí)行任務(wù)的糊秆,Android1.6的時(shí)候AsyncTask開(kāi)始采用線(xiàn)程池處理并行任務(wù)。但是Android3.0開(kāi)始解寝,為了避免AsyncTask所帶來(lái)的并發(fā)錯(cuò)誤扩然,AsyncTask又采用一個(gè)線(xiàn)程來(lái)串行執(zhí)行任務(wù)。盡管如此聋伦,在Android3.0以及以后的版本中,仍然可以通過(guò)AsyncTask的executeOnExecutor()(此方法是Android3.0之后新添加的方法)方法來(lái)并行的執(zhí)行任務(wù)界睁。
AsyncTask對(duì)THREAD_POOL_EXECUTOR這個(gè)線(xiàn)程池的配置如下:
*核心線(xiàn)程數(shù)等于CPU核心數(shù)+1觉增;
*線(xiàn)程池的最大線(xiàn)程數(shù)為CPU核心數(shù)的2倍+1;
*核心線(xiàn)程無(wú)超時(shí)機(jī)制翻斟,非核心線(xiàn)程在閑置時(shí)的超時(shí)時(shí)間為1秒逾礁;
*任務(wù)隊(duì)列的容量為128;
2.HandlerThread:是一種具有消息循環(huán)的線(xiàn)程访惜,在它的內(nèi)部可以使用Handler嘹履。
它的實(shí)現(xiàn)很簡(jiǎn)單,就是在run方法中通過(guò)Looper.prepare()來(lái)創(chuàng)建消息隊(duì)列债热,并通過(guò)Looper.loop()來(lái)開(kāi)啟消息循環(huán)砾嫉,這樣在實(shí)際的使用中就允許在HandlerThread中創(chuàng)建Handler了,外界需要通過(guò)Handler的消息方法來(lái)通知HandlerThread執(zhí)行一個(gè)具體的任務(wù)窒篱。由于HandlerThread的run方法是一個(gè)無(wú)限循環(huán)焕刮,因此當(dāng)明確不需要再使用HandlerThread時(shí)舶沿,可以通過(guò)它的quit或者quitSafely方法來(lái)終止線(xiàn)程的執(zhí)行。
3.IntentService:是一個(gè)服務(wù)配并,系統(tǒng)對(duì)其進(jìn)行了封裝使其可以更方便的執(zhí)行后臺(tái)任務(wù)括荡,IntentService內(nèi)部采用HandlerThread來(lái)執(zhí)行任務(wù),當(dāng)任務(wù)執(zhí)行完畢后IntentService會(huì)自動(dòng)退出溉旋。從任務(wù)執(zhí)行的角度來(lái)看畸冲,IntentService的作用很想一個(gè)后臺(tái)線(xiàn)程,但是IntentService是一種服務(wù)观腊,它不容易被系統(tǒng)殺死從而可以盡量保證任務(wù)的執(zhí)行邑闲,而如果是一個(gè)后臺(tái)線(xiàn)程,由于這個(gè)時(shí)候進(jìn)程中沒(méi)有活動(dòng)的四大組件恕沫,那么這個(gè)進(jìn)程的優(yōu)先級(jí)就會(huì)非常低监憎,會(huì)很容易被系統(tǒng)殺死,這就是IntentService的優(yōu)點(diǎn)婶溯。
它繼承了Service并且是一個(gè)抽象類(lèi)鲸阔,因此必須創(chuàng)建它的子類(lèi)才能使用IntentService。需要實(shí)現(xiàn)onHandleIntent方法迄委。
當(dāng)任務(wù)執(zhí)行后它會(huì)自動(dòng)停止褐筛。
IntentService中的任務(wù)是串行排隊(duì)執(zhí)行的。