在有界面的Android應用中,後臺異步執行一些事情是常見的場景,這時候我們從底層開始寫起的話,就需要瞭解比較深層的東西,比如這篇文章“Android 的消息隊列模型”提到的Looper、Handler、Message、MessageQueue。
Android為瞭降低這個開發難度,提供瞭AsyncTask。AsyncTask就是一個封裝過的後臺任務類,顧名思義就是異步任務。
AsyncTask直接繼承於Object類,位置為android.os.AsyncTask。要使用AsyncTask工作我們要提供三個泛型參數,並重載幾個方法(至少重載一個)。
AsyncTask定義瞭三種泛型類型 Params,Progress和Result。
Params 啟動任務執行的輸入參數,比如HTTP請求的URL。
Progress 後臺任務執行的百分比。
Result 後臺執行任務最終返回的結果,比如String。
使用過AsyncTask 的同學都知道一個異步加載數據最少要重寫以下這兩個方法:
doInBackground(Params…) 後臺執行,比較耗時的操作都可以放在這裡。註意這裡不能直接操作UI。此方法在後臺線程執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用publicProgress(Progress…)來更新任務的進度。
onPostExecute(Result) 相當於Handler 處理UI的方式,在這裡面可以使用在doInBackground 得到的結果處理操作UI。 此方法在主線程執行,任務執行的結果作為此方法的參數返回
有必要的話你還得重寫以下這三個方法,但不是必須的:
onProgressUpdate(Progress…) 可以使用進度條增加用戶體驗度。 此方法在主線程執行,用於顯示任務執行的進度。
onPreExecute() 這裡是最終用戶調用Excute時的接口,當任務執行之前開始調用此方法,可以在這裡顯示進度對話框。
onCancelled() 用戶調用取消時,要做的操作
使用AsyncTask類,以下是幾條必須遵守的準則:
Task的實例必須在UI thread中創建;
execute方法必須在UI thread中調用;
不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)這幾個方法;
該task隻能被執行一次,否則多次調用時將會出現異常;
一個超簡單的理解 AsyncTask 的例子:
這個例子後臺sleep一定時間後更新前段進度條的進度,當完成後把進度條隱藏掉。
layout 文件
1.0″ encoding=”utf-8″?>
http://schemas.android.com/apk/res/android”
android:orientation=”vertical” android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
@+id/progress_bar”
android:layout_width=”200dip” android:layout_height=”200dip”
android:layout_gravity=”center” android:max=”100″ android:progress=”0″>
代碼文件
package ghj1976.AsyncTask;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
public class AsyncTaskActivity extends Activity {
public ProgressBar pBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pBar = (ProgressBar) findViewById(R.id.progress_bar);
// AsyncTask.execute()要在主線程裡調用
new AsyncLoader().execute((Void) null);
}
// 設置三種類型參數分別為 Params = Void, Progress = Integer,Result = Void
class AsyncLoader extends AsyncTask {
@Override
protected Void doInBackground(Void… params) {
publishProgress(0);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(50);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(100);
return null;
}
@Override
protected void onPostExecute(Void v) {
pBar.setVisibility(View.INVISIBLE);
}
@Override
protected void onProgressUpdate(Integer… values) {
pBar.setProgress(values[0]);
}
}
}
說明:
JAVA中類型後面跟三個點,表示的是可變數組參數
/kf/201105/89976.html