5月 25
処理を別スレッドにしてその間はプログレスダイアログを出す。こんなこと良くあると思います。では途中で処理を止めたいときはどうすればいいんだろう?こんな時のテクニックです。

まずはサンプルアプリをご覧ください。ボタンを押すと中止ボタンのついたプログレスダイアログを表示し、中止ボタンを押すと「中止しました」のトーストメッセージを表示し、中止ボタンを押さないで処理が終了すると「終了しました」のトーストメッセージを表示します。

device-1.png device-2.png

開始ボタンを押すと中止ボタン付きのプログレスダイアログを表示すると同時にバックグラウンドで動作するスレッドを作成します。

        Button btnStart = (Button)findViewById(R.id.btnStart);
        btnStart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                showDialog(REQ_PROGRESS_DIALOG);

                thread = new MyThread();
                thread.start();
            }
        });

作成するスレッドには脱出ポイントを用意し、定期的にスレッドの終了指示がなされていないかどうかをチェックしてあげます。中止するにはプログレスダイアログの中止ボタンを押すとこのスレッドを終了フラグを立ててあげればいいです。スレッドが終了指示で終わったかそれとも処理を終えて止まったかの区別をすることもできます。

    private class MyThread extends Thread {
        private boolean running = true;
        private boolean interupted = true;

        @Override
        public void run() {
            int counter = 10;
            try {
                while (running) {
                    Thread.sleep(500);
                    counter --;
                    if (counter == 0) {
                        stop_();
                        interupted = false;
                    }
                }

            } catch (InterruptedException e) {
            }

            handler.post(new Runnable() {
                @Override
                public void run() {
                    dialog.dismiss();
                    Toast.makeText(Main.this,
                            interupted ? "中止しました" : "終了しました", Toast.LENGTH_SHORT).show();
                }
            });
        }

        public void stop_() {
            running = false;
        }

端末ローテーション時の処理の無効化

あと、プログレスダイアログ表示中に端末の向きが変わると面倒なことになるので、向きが変わったときに走る処理をオーバライドして初期化処理が走らないようにしています。

まず、AndroidManifest.xml の Activity の指定のところで android:configChanges=”orientation” を指定します。

<activity android:name=".Main" android:configChanges="orientation">

次に Main.java で onConfigurationChanged をオーバライドします。処理の記述は必要ありません。

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

サンプルコード

サンプルアプリのソースコードは Google Code で公開しています。完全なサンプルコードを参照したい場合はそちらをどうぞ。



Posted by sak+

One Response to “プログレスダイアログから処理を中断する。”

  1. […] 過去のエントリ『プログレスダイアログから処理を中断する。』の中で、端末の向きを変更した場合に onCreate が走つのを避けたい場合、AndroidManifest.xml の中で android:configChanges=”orientation” を指定すると onCreate の代わりに onConfigurationChanged が走りますよ!と紹介しています。 […]

preload preload preload