除了傳統的Thread之外,還包含AsyncTask、HandlerThread、以及IntentService,這三者的底層實現也是線程
AsyncTask 併發
從實現上來講,AsyncTask封裝了Thread和Handler,經過AsyncTask能夠更加方便地執行後臺任務以及在主線程中訪問UI 異步
可是,AsyncTask並不適合進行特別耗時的後臺任務,對於特別耗時的任務來講,建議使用線程池。 spa
AsyncTask是一個抽象的泛型類,它提供了Params、Progress、和Result這三個泛型參數, 線程
其中Params表示參數的類型,Progress表示後臺任務的執行進度的類型,而Result則表示後臺任務的返回結果的類型。 對象
若是不須要傳遞具體的參數,那麼這三個泛型參數能夠用Void來代替。 it
- onPreExecute() 在主線程中執行,在異步任務執行以前。通常能夠用於一些準備工做
- doInBackground(Params... params),在線程池中執行,此方法可用於執行異步任務,params參數表示異步任務的輸入參數。
- onProgressUpdate(Progress...values),在主線程中執行,當後臺任務的執行進度發生改變時會調用
- onPostExecute(Result result),在主線程中執行,在異步任務執行以後,此方法會調用,result參數是後臺任務的返回值。
此外還提供了onCancelled()方法,一樣在主線程中執行,當異步任務被取消,onCancelled()方法會被調用,這個時候onPostExecute則不會被調用。 後臺
AsyncTask在具體的使用過程當中也是有 一些條件限制的,主要有: 泛型
- AsyncTask的類必須在主線程中加載,這就意味着第一次訪問AsyncTask必須發生在主線程中,固然這個過程在Android4.1及以上版本中已經被系統自動完成。
Android5.0中,ActivityThread的main方法中,它會調用AsyncTask的init方法,這就知足了AsyncTask的類必須在主線程中進行加載這個條件了。 date
- AsyncTask的對象必須在主線程中建立
- execute方法必須在UI線程調用
- 不要在程序中直接調用onPreExecute()、onPostExecute()、doInBackground和onProgressUpdate方法
- 一個AsyncTask對象只能執行一次,即只能調用一次execute方法
- 在Android1.6以前,AsyncTask是串行執行任務的,Android1.6的時候開始採用線程池處理並行任務, 可是從Android3.0開始,爲了不AsyncTask所帶來的併發錯誤,AsyncTask又採用一個線程來串行執行任務, 儘管如此,在Android3.0及以後的版本中,咱們仍能夠經過AsyncTask的executeOnExecutor方法來並行地執行任務。