質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Java

    14471questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6750questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3918questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

タイムアウト付きの処理中に処理中ダイアログを表示したい

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,522

teretail

score 15

前提・実現したいこと

ボタンをクリックすると、まず確認ダイアログが表示される。
「実行する」を選択すると処理中ダイアログが表示され、
バックグラウンドで時間の掛かる処理が実行される。
一定時間内に処理が終わらないと、タイムアウトとなる。

これを実現するため、以下のコードを書きました。

該当のソースコード

    public void onButtonClick(View view) {
        new AlertDialog.Builder(this)
                .setTitle("タイトル")
                .setMessage("実行します。よろしいですか?")
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    // OKタップ時
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        // 処理中ダイアログ表示
                        ProgressDialog progressDialog = new ProgressDialog(Main1Activity.this);
                        progressDialog.setMessage("処理中です...");
                        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                        progressDialog.setCanceledOnTouchOutside(false);
                        progressDialog.show();

                        // ここで処理を行う
                        try {
                            ExecutorService service = Executors.newSingleThreadExecutor();
                            Future<String> future = service.submit(new Callable<String>() {
                                @Override
                                public String call() throws Exception {
                                    String ret = "";

                                    // 時間の掛かる処理
                                    for (int i = 0; i < 500000000; i++) {
                                        // 割り込みがあったら中断
                                        if (Thread.interrupted()) {
                                            throw new InterruptedException();
                                        }

                                        ret = ret + "0";
                                    }

                                    return ret;
                                }
                            });

                            String result = future.get(30, TimeUnit.SECONDS);
                            service.shutdown();

                            Toast.makeText(getApplicationContext(), "処理を完了しました", Toast.LENGTH_SHORT).show();
                        }
                        catch (InterruptedException e) {
                            Toast.makeText(getApplicationContext(), "InterruptedException", Toast.LENGTH_SHORT).show();
                        }
                        catch (ExecutionException e) {
                            Toast.makeText(getApplicationContext(), "ExecutionException", Toast.LENGTH_SHORT).show();
                        }
                        catch (TimeoutException e) {
                            Toast.makeText(getApplicationContext(), "TimeoutException", Toast.LENGTH_SHORT).show();
                        }

                        // 処理が終わったらダイアログを閉じる
                        if (progressDialog != null) {
                            progressDialog.dismiss();
                            progressDialog = null;
                        }

                        return;
                    }
                })
                .setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
                    // キャンセルタップ時
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getApplicationContext(), "キャンセルしました", Toast.LENGTH_SHORT).show();
                    }
                })
                .show();
    }

発生している問題・エラーメッセージ

処理は実行され、一定時間でタイムアウトも発生しますが、
処理中ダイアログが表示されません。

補足情報(言語/FW/ツール等のバージョンなど)

Android Studio 2.1.3

どこが悪いのかご教示ください。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

AsyncTaskを使うといい感じで実装できると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/19 08:29

    お返事遅くなってしまい、すみません。
    ご回答ありがとうございます。
    まだ組めてないので、確認でき次第ご報告致します。

    キャンセル

0

表示の処理と非表示の処理が連続して書かれているので、ダイアログは表示してすぐに非表示されています。

非表示の処理はタイムアウト、または処理の完了時に実行するように修正しましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/19 08:28

    お返事遅くなってしまい、すみません。
    ご回答ありがとうございます。
    for分の後、catchの中にdismiss()を移しましたが、やはり表示されませんでした。

    キャンセル

同じタグがついた質問を見る

  • Java

    14471questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6750questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3918questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。