三個泛型引數:
Param 任務執行器需要的資料型別
Progress 後臺計算中使用的進度單位資料型別
Result 後臺計算返回結果的資料型別有些引數是可以設定為不使用的,只要傳遞為Void型即可,比如AsyncTask
四個步驟:onPreExecute(),執行預處理,它執行於UI執行緒,可以為後臺任務做一些準備工作,比如繪製一個進度條控制元件。doInBackground(Params…),後臺程式執行的具體計算在這裡實 現,doInBackground(Params…)是AsyncTask的關鍵,此方法必須過載。在這個方法內可以使用 publishProgress(Progress…)改變當前的進度值。onProgressUpdate(Progress…),執行於UI執行緒。如果在doInBackground(Params…)中 使用了publishProgress(Progress…),就會觸發這個方法。在這裡可以對進度條控制元件根據進度值做出具體的響應。onPostExecute(Result),執行於UI執行緒,可以對後臺任務的結果做出處理,結果就是doInBackground(Params…)的返回值。此方法也要經常過載,如果Result為null表明後臺任務沒有完成(被取消或者出現異常)。
這4個方法都不能手動呼叫。而且除了doInBackground(Params…)方法,其餘3個方法都是被UI執行緒所呼叫的,所以要求:1) AsyncTask的例項必須在UI thread中建立;2) AsyncTask.execute方法必須在UI thread中呼叫;
Task只能被執行一次,多次呼叫時將會出現異常,而且是不能手動停止。
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class AsyncTaskTest extends Activity {
TextView tv;
final String TAG="AsyncTaskTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.label);
new MyTask().execute(6, 12, 7);
}
class MyTask extends AsyncTask<Integer, Integer, Integer> {
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(TAG, "onPreExecute()");
}
@Override
protected Integer doInBackground(Integer... params) {
Log.d(TAG, "doInBackground()");
int p = 0;
for (int index = 0; index < params.length; index++) {
int num = params[index];
for (int j = 0; j < num; j++) {
if (num - j <= 0) {
break;
}
p++;
publishProgress(p);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return p;
}
@Override
protected void onProgressUpdate(Integer... progress) {
Log.d(TAG, "onProgressUpdate()");
tv.append("\nProgress: " + progress[0]);
}
@Override
protected void onPostExecute(Integer result) {
Log.d(TAG, "onPostExecute()");
tv.append("\nFinished. Result: " + result);
}
@Override
protected void onCancelled() {
super.onCancelled();
Log.d(TAG, "onCancelled()");
}
}
}
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class AsyncTaskTest extends Activity {
TextView tv;
final String TAG="AsyncTaskTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.label);
new MyTask().execute(6, 12, 7);
}
class MyTask extends AsyncTask<Integer, Integer, Integer> {
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(TAG, "onPreExecute()");
}
@Override
protected Integer doInBackground(Integer... params) {
Log.d(TAG, "doInBackground()");
int p = 0;
for (int index = 0; index < params.length; index++) {
int num = params[index];
for (int j = 0; j < num; j++) {
if (num - j <= 0) {
break;
}
p++;
publishProgress(p);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return p;
}
@Override
protected void onProgressUpdate(Integer... progress) {
Log.d(TAG, "onProgressUpdate()");
tv.append("\nProgress: " + progress[0]);
}
@Override
protected void onPostExecute(Integer result) {
Log.d(TAG, "onPostExecute()");
tv.append("\nFinished. Result: " + result);
}
@Override
protected void onCancelled() {
super.onCancelled();
Log.d(TAG, "onCancelled()");
}
}
}