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