ProgressDialogの表示方法

今回はProgressDialogを使用方法を書いていきたいと思います。時間のかかる処理を実装するときに、処理中である事を視覚的に伝えることができるので実装できるととても便利だと思います。

簡単なサンプルを作成したので、参考にしてみてください。


メイン画面
f:id:nlinks:20151118135504p:plain

処理中
f:id:nlinks:20151118135513p:plain

処理終了後
f:id:nlinks:20151118135519p:plain

① まずはメイン画面を作成します。画面はボタンと結果を表示するためのTextViewで構成します。

 1)レイアウトファイル(fragment_main.xml

<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"
    tools:context=".MainActivityFragment">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Calc"
            android:id="@+id/button"
            android:onClick="onClickCalc" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/textView"
            android:padding="10dp" />
    </LinearLayout>
</RelativeLayout>

 2)MainActivity.java

public class MainActivity extends AppCompatActivity 
{

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

    AsyncTaskProgressDialog m_AsyncTaskProgressDialogThread;

    /* Calcボタン押下時の処理 */
    public void onClickCalc(View view)
    {
        // 非同期(スレッド)処理クラスの生成
        this.m_AsyncTaskProgressDialogThread = new AsyncTaskProgressDialog(this);
        // Listenerの設定
        this.m_AsyncTaskProgressDialogThread.setLisner(new AsyncTaskProgressDialog.ProcessFinishListener() {
            public void onProcessFinish()
            {
                ((TextView)findViewById(R.id.textView)).setText("処理完了");
            }
        });
        // 非同期(スレッド)処理の実行
        this.m_AsyncTaskProgressDialogThread.execute();
    }
}

② 次にProgressDialogの表示とバックグラウンド処理を行うクラスを作成します。

 1)AsyncTaskProgressDialog.java

public class AsyncTaskProgressDialog extends AsyncTask<Void, Void, String> 
{
    // イベント通知用
    ProcessFinishListener mListener;

    // イベント生成
    public interface ProcessFinishListener {
        public void onProcessFinish();
    }

    // 処理終了後実行されるイベント
    public void setLisner(ProcessFinishListener listner) {
        mListener = listner;
    }

    private Activity m_Activity;
    public ProgressDialog m_ProgressDialog;

    /*
     * コンストラクタ
     */
    public AsyncTaskProgressDialog(Activity activity) {
        // 呼び出し元のアクティビティを変数へセット
        this.m_Activity = activity;
    }

    /*
     * 実行前の事前処理
     */
    @Override
    protected void onPreExecute() {
        // プログレスダイアログの生成
        this.m_ProgressDialog = new ProgressDialog(this.m_Activity);
        // プログレスダイアログの設定
        this.m_ProgressDialog.setMessage("処理実行中...");
        // プログレスダイアログの表示
        this.m_ProgressDialog.show();

        return;
    }

    /*
     * バックグラウンドで実行する処理
     */
    @Override
    protected String doInBackground(Void... params) 
  {
        String ret = "";
        try
        {
            // 実際はこの部分に行いたい処理を実装する
            // 例:初期データのロードなど...
            Thread.sleep(3000);

        }
        catch (InterruptedException e)
        {
      // エラー処理の実装
        }
        return ret;
    }

    /*
     * メインスレッドで実行する処理
     */
    @Override
    protected void onPostExecute(String result) {
        // プログレスダイアログを閉じる
        if (this.m_ProgressDialog != null && this.m_ProgressDialog.isShowing())
        {
            this.m_ProgressDialog.dismiss();
        }

    // 呼出し元のメソッドを起動
        mListener.onProcessFinish();
        return;
    }
}


Activityにてスレッドを生成し、スレッドに処理を依頼します。スレッド側ではまず、onPreExecute()メソッドが呼び出されるので、そこでProgressDialogを表示するように設定し、doInBackground()メソッドに実際に行いたい処理を実装します。doInBackground()の処理が終了すると、onPostExecute()メソッドが呼び出されるので、ここでDialogを消して、Activity側に用意しているListenerを呼出します。処理終了後に特になにも行わないのであればListenerは必要ありません。

単純なダイアログ表示に比べると多少めんどくさいですが、時間のかかる処理を行う場合には、実装が必須となってくると思うので、機会があれば挑戦してもらえればと思います。