Android的線程和線程池

UKHGuillerm 8年前發布 | 7K 次閱讀 Android開發 移動開發

來自: http://my.oschina.net/gabriel1215/blog/626137


除了傳統的Thread以外,還包含AsyncTask、HandlerThread、以及IntentService,這三者的底層實現也是線程

AsyncTask

從實現上來說,AsyncTask封裝了Thread和Handler,通過AsyncTask可以更加方便地執行后臺任務以及在主線程中訪問UI

但是,AsyncTask并不適合進行特別耗時的后臺任務,對于特別耗時的任務來說,建議使用線程池。

AsyncTask是一個抽象的泛型類,它提供了Params、Progress、和Result這三個泛型參數,

其中Params表示參數的類型,Progress表示后臺任務的執行進度的類型,而Result則表示后臺任務的返回結果的類型。

如果不需要傳遞具體的參數,那么這三個泛型參數可以用Void來代替。

  • 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的類必須在主線程中進行加載這個條件了。

  • AsyncTask的對象必須在主線程中創建
  • execute方法必須在UI線程調用
  • 不要在程序中直接調用onPreExecute()、onPostExecute()、doInBackground和onProgressUpdate方法
  • 一個AsyncTask對象只能執行一次,即只能調用一次execute方法
  • 在Android1.6之前,AsyncTask是串行執行任務的,Android1.6的時候開始采用線程池處理并行任務,
    但是從Android3.0開始,為了避免AsyncTask所帶來的并發錯誤,AsyncTask又采用一個線程來串行執行任務,
    盡管如此,在Android3.0及之后的版本中,我們仍可以通過AsyncTask的executeOnExecutor方法來并行地執行任務。

 本文由用戶 UKHGuillerm 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!