標籤:四大組件 更新 相關 res 異常 ctas result cell 調用
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的線程和線程池