這篇文章還是根據(jù)《android藝術(shù)開發(fā)探索》的筆記
AsyncTask封裝了線程池和handler
主線程的作用是運(yùn)行四大組件以及處理他們和用戶的交互
AsyncTask必須在主線程中加載,execute方法必須運(yùn)行在Ui線程中,一個(gè)AsyncTask對(duì)象只能執(zhí)行依次,也就是只能調(diào)用一次execute方法。
AsyncTask的工作原理:先從他的execute方法開始,他會(huì)調(diào)用executeOnExecutor方法,并給它傳遞一個(gè)串行的Executor(SerialExecutor),然后將參數(shù)封裝為FutureTask對(duì)象,他是一個(gè)并發(fā)類,充當(dāng)Runnable的作用,在execute里面最先執(zhí)行onPreExecute方法,然后將FutureTask對(duì)象通過SerialExecutor的對(duì)象的execute方法傳遞進(jìn)來,在這里面,首先會(huì)把FutureTask對(duì)象插入到mTasks中,如果當(dāng)前沒有AsyncTask任務(wù),就執(zhí)行下一個(gè)任務(wù),從這可以充分看出,默認(rèn)情況下AsyncTask.execute()是串行的。
AsyncTask有兩個(gè)線程池,SerialExecutoe和THREAD_POOL_EXECUTOR,還有一個(gè)Handler(InternalHandler),SerialExecutoe是用于任務(wù)的排隊(duì)的,而THREAD_POOL_EXECUTOR是真正執(zhí)行任務(wù)的,而InternalHandler是將執(zhí)行的環(huán)境從線程池切換到主線程。怎么切換的呢?上面說到FutureTask在任務(wù)棧里面,在SerialExecutor.execute()中會(huì)調(diào)用FutureTask的run()方法,在run中又會(huì)調(diào)用mWorker的call方法,call最終會(huì)在線程池中執(zhí)行,在call中,會(huì)通過Message將result發(fā)送出去,會(huì)在IntermalHandler中handleMessage方法中收到Message,而IntermalHandler是靜態(tài)對(duì)象,就必須要求在主線程中創(chuàng)建。如果收到MESSAGE_POST_RESULT消息后,就會(huì)調(diào)用AsyncTask的finish方法,在這里有一個(gè)小邏輯,但是有大作用,首先會(huì)判斷isCancelled,true就會(huì)調(diào)用onCancelled方法,false就會(huì)調(diào)用onPostExecute方法,也就是說? run完了以后才會(huì)調(diào)用這兩個(gè)方法,然后在中間取消的話,僅僅就是不調(diào)用onPostExecute方法。
最后聲明一下,android在3.0之前是并行的線程,之后就是串行的,當(dāng)然也可以調(diào)用executeOnExecutor方法也可以實(shí)現(xiàn)并行。
HandlerThread:是一種可以使用handler的Thread,就是在run方法中通過Looper.prepare方法來創(chuàng)建消息隊(duì)列,并通過Looper.loop()來開啟消息循環(huán)。由于HandlerThread的run是一個(gè)無限循環(huán),因此不需要的時(shí)候,就把他quit或者quitSafely終止掉。
IntentService:是一種特殊的Service,可用以執(zhí)行耗時(shí)的后臺(tái)任務(wù),由于它是Service,所以他的優(yōu)先級(jí)比單純的線程要高。
線程池:優(yōu)點(diǎn)(1)重用線程池中的線程,避免線程的創(chuàng)建和銷毀所帶來的性能開銷(2)能有效的控制線程池的最大并發(fā)數(shù),避免大量線程之間搶占資源而導(dǎo)致的阻塞現(xiàn)象(3)能夠?qū)€程進(jìn)行簡(jiǎn)單的管理,并能提供定時(shí)執(zhí)行以及指定間隔循環(huán)等功能
ThreadPoolExecutor是線程池的實(shí)現(xiàn)類,他的構(gòu)造函數(shù)的參數(shù)有好多個(gè),在這就大概介紹一下吧,corePoolSize 代表的是線程池的核心線程數(shù),默認(rèn)情況下,他會(huì)一直存活下去,如果ThreadPoolExecutor的屬性allowCoreThreadTimeOut設(shè)置為true的話,他就和非核心線程一樣了,就有了超時(shí)策略。如果超過了keepLive的時(shí)間的話,coreThread就會(huì)被終止。
maximumPoolSize代表的是 最大線程數(shù),當(dāng)活動(dòng)線程達(dá)到這個(gè)數(shù)值之后,后續(xù)的新任務(wù)就會(huì)被阻塞
keeoAliveTime 代表的是非核心線程閑置的超時(shí)時(shí)長(zhǎng),allowCoreThreadTimeOut設(shè)置為true的話,核心線程也會(huì)被收回。
unit 指定keepAliveTime參數(shù)的時(shí)間單位,這是一個(gè)枚舉類型。
threadFactory:線程工廠,為線程池提供創(chuàng)建新線程的功能,它是一個(gè)接口
這兒有一個(gè)現(xiàn)象:當(dāng)核心線程都在執(zhí)行任務(wù)的時(shí)候,如果再來一個(gè)任務(wù),他不會(huì)創(chuàng)建非核心線程來執(zhí)行,而是把他們加到任務(wù)隊(duì)列里,然后等待核心線程。如果任務(wù)隊(duì)列滿了以后,他才會(huì)創(chuàng)建非核心線程。
線程池的分類有四種,分別為FixedThreadPool? CashedThreadPool? ScheduledThreadPool? 以及SingleThreadExecutor? 具體可以查看網(wǎng)上的資料。