Androidプログラマへの道 〜 Moonlight 明日香 〜 - 非同期処理の進捗を表示する
バックグラウンド処理の進捗状況を表示したい場合, AsyncTaskクラス内でProgressDialogクラスを利用する.

進捗状況表示

  • MainActivity.java
    • AsyncTaskで非同期処理を行う」を参照して, 非同期処理を実装する.
    • AsyncTask#onPreExecuteメソッド
      • ProgressDialog#setXXXメソッドで, プログレスバーのダイアログの設定を行う.
      • ProgressDialog#showメソッドで, プログレスバーのダイアログを表示する.
    • AsyncTask#doInBackgroundメソッド
      • AsyncTask#publishProgressメソッドで進捗状況を通知する.
    • AsyncTask#onPostExecuteメソッド
      • ProgressDialog#dismissメソッドで, プログレスバーのダイアログを閉じる.
    • AsyncTask#onProgressUpdateメソッド
      • ProgressDialog#setProgressメソッドで, プログレスバーを更新する.
package com.moonlight_aska.android.asynctask02;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
  Context mContext = this;
  ProgressDialog mDialog = null;
  SampleAsyncTask mTask = null;
  Button mBtn = null;

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

    mBtn = (Button)findViewById(R.id.btn_id);
    mBtn.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
    // TODO Auto-generated method stub
    mTask = new SampleAsyncTask();
    mTask.execute("param");
  }

  // AsyncTaskのサブクラス
  private class SampleAsyncTask extends AsyncTask<String, Integer, Long> {
    // バックグラウンド処理の前に実行される処理
    @Override
    protected void onPreExecute() {
      // TODO Auto-generated method stub
      Log.v("AsyncTask", "onPreExecute");
      // Progress Dialogの表示
      mDialog = new ProgressDialog(mContext);
      mDialog.setTitle("しばらくお待ちください");
      mDialog.setMessage("非同期処理テスト中....");
      mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
      mDialog.setMax(100);
      mDialog.setProgress(0);
      mDialog.show();
    }

    // バックグラウンド処理
    @Override
    protected Long doInBackground(String... params) {
      // TODO Auto-generated method stub
      Log.v("AsyncTask", "doInBackground");
      try {
        for (int i=0; i<10; i++) {
          Thread.sleep(1000);
          // 進捗更新
          publishProgress((i+1)*10);
        }
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      return 100L;
    }

    // バックグラウンド処理完了後に実行される処理
    @Override
    protected void onPostExecute(Long result) {
      // TODO Auto-generated method stub
      Log.v("AsyncTask", "onPostExecute");
      mDialog.dismiss();
    }

    // 更新処理
    @Override
    protected void onProgressUpdate(Integer... values) {
      // TODO Auto-generated method stub
      mDialog.setProgress(values[0]);
    }
  }
}
  • 実行例