AsyncTask(非同步訊息處理機制)
阿新 • • 發佈:2019-01-31
原理
在android中有兩條原則,第一條是:我們不能再UI Thread中進行耗時的操作 以免阻塞UI Thread 第二條是:不能再UI Thread之外的執行緒中操縱UI元素 所以當我們需要從網上下載一張圖片(耗時操作)並且更新到UI介面(更新到UI中)的時候,這個時候就要用到非同步訊息處理機制:Handler機制(之前的部落格已經詳細介紹)請點選 接下來講解另外一種訊息處理機制:AsyncTask機制 AsyncTask允許我們在後臺執行一個非同步任務,我們可以將耗時操作放在非同步任務中執行,並隨時將任務執行的結果返回給UI執行緒來更新UI用法
AsyncTask是一個抽象類,當我們繼承使用它的時候我們需要指明它的三個泛型AsyncTask <Params, Progress, Result>
- Params: 指定的是我們傳遞給非同步任務執行時的引數的型別
- Progress: 指定的是我們的非同步任務在執行的時候將執行的進度返回給UI執行緒的引數的型別
- Result: 指定的是非同步任務執行完後返回給UI執行緒的結果的型別
4個步驟:當我們執行一個非同步任務時,需要按照下面的4個步驟分別執行:
- onPreExecute(): 這個方法是在執行非同步任務之前的時候執行,並且是在UI Thread當中執行的,通常我們在這個方法裡做一些UI控制元件的初始化的操作,例如彈出ProgressDialog
- doInBackground(Params... params): 在onPreExecute()方法執行完後,會馬上執行這個方法,這個方法就是來處理非同步任務的方法,Android作業系統會在後臺的執行緒池當中開啟一個worker thread來執行這個方法(即在worker thread當中執行),執行完後將執行結果傳送給最後一個 onPostExecute 方法,在這個方法裡,我們可以從網路當中獲取資料等一些耗時的操作
- onProgressUpdate(Progess... values): 這個方法也是在UI Thread當中執行的,在非同步任務執行的時候,有時需要將執行的進度返回給UI介面,例如下載一張網路圖片,我們需要時刻顯示其下載的進度,就可以使用這個方法來更新進度。這個方法在呼叫之前,我們需要在
doInBackground 方法中呼叫一個 publishProgress(Progress)
- onPostExecute(Result... result): 當非同步任務執行完之後,就會將結果返回給這個方法,這個方法也是在UI Thread當中呼叫的,我們可以將返回的結果顯示在UI控制元件上