2010年11月1日月曜日

ProgressDialogで進行状況を表示

ProgressDialogを使うと、進行状況を表示できるようになります。WindowsのProgressBarみたいなものです。

setTitleメソッドで表示するメッセージを指定し、
setMaxで進行状況の最大値、
setButton / setButton2で表示するボタンを指定します。
setProgressで進行状況を設定します。


    private EditText mResultText = null;
    private ProgressDialog mProgressDialog;
    private int mProgress = 0;

                // ProgressDialogクラスで進行状況を表示
                mProgressDialog = new ProgressDialog(MainActivity.this);
                mProgressDialog.setTitle("Progress Dialogで進行状況表示");
                mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                mProgressDialog.setMax(100);
                mProgressDialog.setButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        mResultText.setText("Press OK at " + mProgress + " %");
                    }
                });
                mProgressDialog.setButton2("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        mResultText.setText("Press Cancel at " + mProgress + " %");
                    }
                });
                mProgress = 0;
                mProgressDialog.show();
                mProgressDialog.setProgress(0);

時間のかかる処理を行わせる前に、上記で進行状況表示の初期ダイアログを表示します。
そして、進行状況を逐次表示するために、イベントハンドラを使ってメッセージを受け付けるようにします。

以下がイベントハンドラの例です。イベントハンドラも時間のかかる処理の前に用意しておく必要があります。
イベントハンドラではOSのメッセージを使用しますので、
import android.os.Message
でMessageをインポートしておきます。

    private Handler mProgressHandler = null;
        mProgressHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (mProgress >= 100) {
                    mProgressDialog.dismiss();
                    mResultText.setText("Finished process at " + mProgress + " %");
                } else {
                    mProgress++;
                    mProgressDialog.incrementProgressBy(1);
                    mProgressHandler.sendEmptyMessageDelayed(0, 100);
                }
            }
        };

上記では、単純に進行状況(mProgress)を1ずつ加算していき、100%になったらProgressDialogを閉じて、終了メッセージを表示するという処理になっています。
100になっていなければ、incrementProgressByメソッドでプログレスバーの表示を増加させ、ハンドラのsendEmptyMessageDelayedメソッドで100ms後に自身に0というメッセージを送らせています。

そして、実際に時間のかかる処理を走らせる時に

                mProgressHandler.sendEmptyMessage(0);

としてイベントハンドラに対し0というメッセージを送ります。

上記例では、単純にイベントハンドラが呼ばれる度に進行状況を1ずつ加算していくようにしましたが、sendEmptyMessageで実際のパーセンテージを送信するようにして、もっと正確な進行状況が表示されるようにすると、もっと良くなるかもしれません。

0 件のコメント:

コメントを投稿