1.為什么要異步任務
- Android單線程模式
- 耗時操作放在非主線程(UI線程)中執行
我們都知道Android是單線程模式,只有主線程才能對UI操作,簡稱UI線程。當然這樣的好處是:保證UI的穩定性、准確性,避免多線程同時對UI的操作,導致UI的混亂
但同時Android是一個多線程的操作系統,不可能把全部的事情放在主線程。如果任務堵塞,當時間過長,會拋出ANR(Application Not Responding)錯誤。
2.AsyncTask為何而生
- 子線程中更新UI
- 封裝、簡化異步操作
3.構建AsyncTask子類的參數
AsyncTask<Params,Progress,Result>是一個抽象類,通常用於被繼承,繼承AsyncTask需要指定如下三個泛型參數:
- Params : 啟動任務時輸入參數的類型。
- Progress : 后台任務執行中返回進度值的類型
- Result : 后台執行任務完成后返回結果的類型
4.構建AsyncTask子類的回調方法
- doInBackground : 必須重寫,異步執行后台程序將要完成的任務。
- onPreExecute : 執行后台耗時操作前被調用,通常用戶完成一些初始化操作。
- onPostExecute : 當doInBackground() 完成后,系統自動調用onPostExecute()方法,並將doInBackground方法返回的值傳給該方法
- onProgressUpdate : 在doInBackground() 方法調用publishProgress() 方法更新任務的執行進度后,就會觸發該方法
現在我們來寫一個測試類:
import android.os.AsyncTask; import android.util.Log; public class AsyncTaskTest extends AsyncTask<Void, Void, Void>{ @Override protected Void doInBackground(Void... params) { Log.i("Task", "doInbackgroun"); return null; } @Override protected void onPostExecute(Void result) { Log.i("Task", "onPostExecute"); super.onPostExecute(result); } @Override protected void onPreExecute() { Log.i("Task", "onPreExecute"); super.onPreExecute(); } @Override protected void onProgressUpdate(Void... values) { Log.i("Task", "onProgressUpdate"); super.onProgressUpdate(values); } }
在MainActivity中引用:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AsyncTaskTest task = new AsyncTaskTest(); task.execute(); }
當我們運行在模擬器上時:
根據上面的第四條所寫,我們在doInBackground中調用publshProgress方法,運行后發現多了一個onProgressUpdate
protected Void doInBackground(Void... params) { Log.i("Task", "doInbackgroun"); publishProgress(params); return null; }
謝謝大家的關注。I love you not for who you are, but for who I am before you.