Android的線程和線程池
1、背景
Android中,線程分為主線程和子線程,主線程主要處理和界面相關的事情,而子線程則往往用於執行耗時操作。
除了Thread本身以外,在Android中可以扮演線程角色還有AsynTask和IntentService,同時HandlerThread也是一種特殊的線程。
對於AsynTask來說,它的底層用到了線程池,AsynTask封裝了線程池和Handler,主要是為了方便開發者在子線程中更新UI。
對於IntentService和HandlerThread,它們的底層則直接使用了線程。HandlerThread是一種具有消息循環的線程,在它的內部可以使用Handler。
IntentService是一個服務,系統對其進行了封裝使其可以更方便地執行後臺任務,IntentService內部采用HandlerThread來執行任務,當任務執行完畢後IntentService會自動退出。
Android主線程的作用是運行四大組件以及處理它們和用戶的交互,而子線程的作用則是執行耗時任務,比如網絡請求,io操作等。
2、AsyncTask
AsyncTask是一種輕量級的異步任務類,可以在線程池中執行後臺任務,然後把執行的進度和最終結果傳遞給主線程並在主線程中更新UI。AsyncTask不適合進行特別耗時的後臺任務,對於特別耗時的任務來說,建議使用線程池。
AsyncTask是一個抽象的泛型類:
public abstract class AsyncTask<Params,Progress,Result>
提供了四個核心方法:
a、onPreExecute(),在主線程中執行,在異步任務執行之前,此方法會被調用,一般可以用於做一些準備工作。
b、doInBackground(Params ... params), 在線程池中執行,此方法用於執行異步任務。可以通過publishProgress方法來更新任務的進度,publishProgress會調用onProgressUpdate方法。此外此方法需要返回結果給onPostExecute方法。
c、onProgressupdate(Progress ...values),在主線程中執行,當後臺任務的執行進度發生改變時此方法會被調用。
d、onPostExecute(Result result),在主線程中執行,在異步任務執行之後,此方法會被調用,其中result參數是後臺任務的返回值,即doInBackground的返回值。
除了上述方法以外,AsyncTask還提供了onCancelled()方法,它同樣在主線程中執行,當異步任務被取消時,onCancelled()方法會被調用,這個時候onPostExecute不會被調用。
註意:
a、AsyncTask的類必須在主線程中加載;
b、AsyncTask的對象必須在主線程中創建;
c、execute方法必須在UI線程調用;
d、一個AsyncTask對象只能執行一次,即只能調用一次execute方法,否則會報運行的異常。
3、HandlerThread
HandlerThread繼承Thread,它是一種可以使用Handler的Thread,它的實現是在run方法中通過Looper.prepare()來創建消息隊列,並通過Looper.loop()來開啟消息循環,這樣在實際的使用中就允許在HandlerThread中創建Handler了。
4、IntentService
IntentService是一種特殊的Service,它繼承了Service並且它是一個抽象類,因此必須創建它的子類才能使用IntentService。
Android的線程和線程池