非同期(スレッド)処理中にプログレスダイアログを表示する (シンプル)




上図のように非同期(スレッド)処理中にプログレスダイアログを表示するには、
AsyncTask継承クラスへ onPreExecute() を追加してプログレスダイアログを表示する処理を記述し、
onPostExecute()、onCanceled()でプログレスダイアログを非表示とする処理を記述すれば良い。

package technoute.site.com.google.sites.sample.thread;


import android.app.Activity;
import android.app.ProgressDialog;
import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.TextView;

/*
 * AsyncTask<型1, 型2,型3>
 *
 *   型1 … Activityから非同期(スレッド)処理へ渡したい変数の型
 *          ※ Activityから呼び出すexecute()の引数の型
 *          ※ doInBackground()の引数の型
 *
 *   型2 … 進捗度合を表示する時に利用したい型
 *          ※ onProgressUpdate()の引数の型
 *
 *   型3 … バックグラウンド処理完了時に受け取る型
 *          ※ doInBackground()の戻り値の型
 *          ※ onPostExecute()の引数の型
 *
 *   ※ それぞれ不要な場合は、Voidを設定すれば良い
 */
public class AsyncTaskProgressDialogSimple extends AsyncTask<Void, Void, String> {

    private Activity       m_Activity;
    public  ProgressDialog m_ProgressDialog;

    /*
     * コンストラクタ
     *
     *  @param activity: 読み出し元Activity
     */
    public AsyncTaskProgressDialogSimple(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;
    }

    /*
     * バックグラウンドで実行する処理
     *
     *  @param params: Activityから受け渡されるデータ
     *  @return onPostExecute()へ受け渡すデータ
     */
    @Override
    protected String doInBackground(Void... params) {

        String ret = "";

        try {
            // Sleep処理(例:HTTP通信)
            Thread.sleep(1000);

            // Sleep処理(例:HTTP解析/画像変換とか)
            Thread.sleep(1000);

            // 取得してきた文字列・画像などをreturnでonPostExecuteへ渡す
            ret = "読み込み完了!";

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return ret;
    }

    /*
     * メインスレッドで実行する処理
     *
     *  @param param: doInBackground()から受け渡されるデータ
     */
    @Override
    protected void onPostExecute(String result) {

        // 読み出し元Activityに設置してあるTextViewを取得
        TextView textView = (TextView)this.m_Activity.findViewById(R.id.textView);

        // TextViewの文字列をセット
        textView.setText(result);

        // プログレスダイアログを閉じる
        if (this.m_ProgressDialog != null && this.m_ProgressDialog.isShowing()) {
            this.m_ProgressDialog.dismiss();
        }

        return;
    }

    /*
     * キャンセル時の処理
     */
    @Override
    protected void onCancelled() {
        super.onCancelled();

        Log.v("AsyncTaskProgressDialogSimpleThread", "onCancelled()");

        if (this.m_ProgressDialog != null) {

            Log.v("this.m_ProgressDialog.isShowing()", String.valueOf(this.m_ProgressDialog.isShowing()));

            // プログレスダイアログ表示中の場合
            if (this.m_ProgressDialog.isShowing()) {

                // プログレスダイアログを閉じる
                this.m_ProgressDialog.dismiss();
            }
        }

        return;
    }
}

また、そのままだと端末の縦横表示切替が行われるとエラーになってしまうため、
呼び出し元Activityでスレッドクラスをメンバ変数で持つようにし、
onPause()でスレッドのプログレスダイアログが表示中の場合は閉じるよう処理してあげる必要がある。

package technoute.site.com.google.sites.sample.thread;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class ActivityMain extends Activity implements OnClickListener {

    AsyncTaskProgressDialogSimple m_SimpleThread;



    /*
     * onPause時の処理
     */
    @Override
    public void onPause() {
        super.onPause();

        Log.v("ActivityMain", "onPause()");

        // "プログレスダイアログ表示(シンプル)" のスレッド、プログレスダイアログが存在する場合
        if (this.m_SimpleThread != null &&
            this.m_SimpleThread.m_ProgressDialog != null) {

            Log.v("this.m_SimpleThread.m_ProgressDialog.isShowing()", String.valueOf(this.m_SimpleThread.m_ProgressDialog.isShowing()));

            // プログレスダイアログ表示中の場合
            if (this.m_SimpleThread.m_ProgressDialog.isShowing()) {

                // プログレスダイアログを閉じる
                this.m_SimpleThread.m_ProgressDialog.dismiss();
            }
        }
    }

    /*
     * ボタンクリック時の処理
     */
    @Override
    public void onClick(View v) {

        //**********************************************************************
        // "プログレスダイアログ表示(シンプル)" の場合
        //**********************************************************************
        if (v.getId() == R.id.button3) {

            // Activityに設置してあるTextViewを取得
            TextView textView = (TextView)this.findViewById(R.id.textView);

            // TextViewの文字列をセット
            textView.setText("読み込み開始...");

            // 非同期(スレッド)処理クラスの生成
            this.m_SimpleThread = new AsyncTaskProgressDialogSimple(this);

            // 非同期(スレッド)処理の実行
            this.m_SimpleThread.execute();
        }
    }
}



Comments