Logicky Blog

Logickyの開発ブログです

Android - AsyncTask

参考:AsyncTask 参考:AsyncTaskを使った非同期処理のきほん

AsyncTask<Params, Progress, Result>

と書いてある。doInBackgroundメソッドの引数の型, onProgressUpdateメソッドの引数の型, onPostExecuteメソッドの戻り値の型らしい。

AsyncTaskクラスを継承したクラスを作って、非同期処理を書く。 Activityで、上記タスクのインスタンスを作って、executeで非同期処理を実行させる。 execute時に、doInBackgroundの引数を渡せる。doInBackgroundの引数は何個でも渡せるようにする必要があるっぽい。

MyTask.java

public class MyTask extends AsyncTask<Integer, Integer, String> {
    private TextView txt;

    public MyTask(TextView txt) {
        super();
        this.txt = txt;
    }

    @Override
    protected String doInBackground(Integer...x) {
        try {
            Log.d("TEST", "Start Sleep");
            Thread.sleep(5000);
        } catch(Exception e) {
            Log.d("TEST", e.getMessage());
        }
        return "終わりました";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        txt.setText(result);
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private MyTask task;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        task = new MyTask((TextView)findViewById(R.id.result));
        task.execute();

        TextView hello = (TextView)findViewById(R.id.hello);
        hello.setText("World");
    }
}

非同期処理中のプログレスバー表示

AsyncTaskは、4ステップある。あと、1回しか使えない。なので一回だけ非同期処理したいときに使うやつらしい。

  1. onPreExecute 実行前
  2. doInBackground 実行開始
  3. onProgressUpdate 実行中
  4. onPostExecute 実行後

onPreExecuteでプログレスバーを初期設定・表示させて、doInBackgroundで進捗状況を計算して、onProgressUpdateを都度実行させて、onProgressUpdateでプログレスバーを更新して、onPostExecuteでプログレスバー消す。

MyTask.java

public class MyTask extends AsyncTask<Integer, Integer, String> {
    private TextView txt;
    private ProgressDialog progress;
    private Activity ac;
    private final Integer wait = 5000;

    public MyTask(Activity a, TextView t) {
        super();
        ac = a;
        txt = t;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progress = new ProgressDialog(ac);
        progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progress.setIndeterminate(false);
        progress.setMax(wait);
        progress.setProgress(0);
        progress.show();
    }

    @Override
    protected String doInBackground(Integer...x) {
        try {
            for(int i = 0; i < wait; i += 200){
                Thread.sleep(200);
                publishProgress(i);
            }
        } catch(Exception e) {
            Log.d("TEST", e.getMessage());
        }
        return "終わりました";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progress.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        progress.dismiss();
        txt.setText(result);
    }
}