【學習筆記】Android的線程和線程池

除了傳統的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方法來並行地執行任務。
相關文章
相關標籤/搜索