在如何使用AsyncTask中有稍微解釋一下AsyncTask的原理,
接下來示範怎麼使用AsyncTask。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<Button
android:id="@+id/send_task"
android:text="send task"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_below="@id/send_task"
android:id="@+id/message"
android:text="Hello World!"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
首先定義一個Button跟一個TextView, 當Button按下去的時候,
就送出一個任務給AsyncTask, 執行完畢後將結果顯示在TextView上面。
接下來設計AsyncTask, 送出5個字串,
當AsyncTask會在doInBackground接收這五個字串,
因此我們就設計一個迴圈讓它定時透過publishProgress這個方法,
去跟onProgressUpdate報告進度,
當所有字串都處理完畢以後,
就可以在onPostExecute內顯示最後結果。
sendTask.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getTask("a", "b", "c", "d", "e");
}
});
//...
private AsyncTask<String, Integer, String[]> getTask(String... name){
stringBuffer.delete(0, stringBuffer.length());
return new AsyncTask<String, Integer, String[]>() {
private int count;
@Override
protected String[] doInBackground(String... params) {
for(String s : params) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(count, params.length);
count++;
}
return params;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int percent = (int)(100 / values[1] * count);
msg.setText(percent + "%");
}
@Override
protected void onPostExecute(String[] s) {
super.onPostExecute(s);
for(String str : s) {
stringBuffer.append(str).append("\n");
msg.setText(stringBuffer);
}
}
}.execute(name);
}
結果如下
程式碼