什麼是AsyncTask?
AsyncTask,是android提供的輕量級的異步類,可以直接繼承AsyncTask,在類中實現異步操作,並提供接口反饋當前異步執行的程度(可以通過接口實現UI進度更新),最後反饋執行的結果給UI主線程
當一個AsyncTask運行的過程中,4個方法的先後順序與作用:
onPreExecute()
|
在excute調用後立即在ui線程中執行,當任務執行之前開始調用此方法,可以在這裏顯示進度對話框。
|
doInBackground()
|
當
onPreExecute() 完成後,
立即在後臺線程中運行,一般執行耗時操作 |
onProgressUpdate(Progress…)
|
可以使用進度條增加用戶體驗度。 此方法在主線程執行,用於顯示任務執行的進度。
|
onPostExecute()
|
後臺運算完成時在ui線程中調用,相當於Handler 處理UI的方式,在這裏面可以使用在doInBackground 得到的結果處理操作UI。
|
要使用AsyncTask工作我們要提供三個泛型參數,並重載幾個方法。
AsyncTask需要定義了三種泛型類型 Params,Progress和Result。
Params 啓動任務執行的輸入參數,比如HTTP請求的URL。
Progress 後臺任務執行的百分比。
Result 後臺執行任務最終返回的結果,比如String。
AsyncTask用在需要在主線程中調用、在背景線程中執行耗時任務、並且在主線程中返回結果的場合。
下面就是一個簡單的ProgressDialog 與AsyncTask的實現 。
private class DownloadAsyncTask extends
AsyncTask<String, Integer, String> {
ProgressDialog pdialog;
public DownloadAsyncTask (Context
context){
//初始化數據
pdialog = new ProgressDialog(context, 0);
pdialog.setButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int i) {
dialog.cancel();
}
});
pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
finish();
}
});
pdialog.setTitle("第一次使用,正在下載數據...");
pdialog.setCancelable(true);
pdialog.setMax(100);
pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
}
@Override
protected String doInBackground(String... params) {
//耗時操作
return null;
}
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected void onPostExecute(String result) {
//執行完畢後 dialog消失
pdialog.dismiss();
}
@Override
protected void onPreExecute() {
//執行開始顯示dialog
pdialog.show();
}
@Override
protected void onProgressUpdate(Integer... values) {
}
}
|
對於寫好的異步任務類,調用方法爲:
DownloadAsyncTask task
= new DownloadAsyncTask (context);
task.execute("");
|
使用AsyncTask類,以下是幾條準則:
Task的實例必須在主線程中創建;
execute方法必須在主線程中調用;
task只能被執行一次,否則多次調用時將會出現異常;