如何使用AsyncTask-實作

如何使用AsyncTask-實作

如何使用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);
}

結果如下

程式碼