web-dev-qa-db-ja.com

Androidでデータの読み込み中に回転ホイールダイアログを表示

アプリがいくつかのデータを読み込んでいる間、スピニングホイールダイアログを表示したい:

Spinning wheel dialog

回転するホイールのダイアログは、ボタンをクリックすると表示されます。以下のコードを使用していますが、回転するホイールが表示されています。何が問題なのでしょうか?

public void CheckAccount(String username, String password) {
    try {

        final ProgressDialog progDailog = ProgressDialog.show(this,
            "Progress_bar or give anything you want",
            "Give message like ....please wait....", true);
        new Thread() {
            public void run() {
                try {
                    // sleep the thread, whatever time you want. 
                    sleep(1000);
                } catch (Exception e) {
                }
                progDailog.dismiss();
            }
        }.start();

        //getting data code here
        //getting data code here
        //getting data code here
        //getting data code here
        //getting data code here

    } catch (Exception e) {
        Log.e(LOG_TAG, e.getMessage());
        PopIt("CheckAccountError", e.getMessage(), "Denied");
    }
}
38
Kris

ですから、この答えがますます多くの賛成票を得ているのを見て、答えの質を向上させるために自分でそれを取るべきだと決めました。オリジナルを見ると、「コードの問題は何ですか?」という質問に対する本当の「答え」はありません。リンクを保持するために、元の回答をそのまま残します。これは、回答の人気を引き起こしたと思われるものです。

更新された回答

「シングルスレッドモデル」に違反している可能性があります。 Android UI Toolkitはスレッドセーフではないため、「メイン」UIスレッドからのみ操作する必要があります。Androidには、使用できる便利なメソッドがいくつかありますUIの操作がUIスレッドで行われていることを確認してください。これらのメソッド呼び出しの詳細の大部分は、Android ここ クイックリファレンス)。

あなたのコードを見ると、私が見る特定の違反は、ProgressDialogがUIスレッドである可能性のあるもので作成され、それが新しく作成されたバックグラウンドスレッドで破棄されることです。

バックグラウンドメソッドをRunnableでカプセル化し、 View#post(Runnable) を使用してバックグラウンドで作業を行う方が良いでしょう。

覚えておいて、バックグラウンドを行うには多くの方法があるので、利用可能なものを見て、あなたの状況にふさわしいものを使用してください。

元の回答

look at one of the manytutorials how to do asynchronous - work in Android .

また、似たような他のStackOverflowの質問もあります

Androidの進行ダイアログの問題

オープンアクティビティの進捗ダイアログ

新しいアクティビティの開始中の進行ダイアログ

Android:Progress Dialog Spinnerが回転しない

進行状況ダイアログの更新

Android:進行状況ダイアログを表示

49

作成します。

ProgressDialog dialog = new ProgressDialog(this); // this = YourActivity
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setTitle("Loading");
dialog.setMessage("Loading. Please wait...");
dialog.setIndeterminate(true);
dialog.setCanceledOnTouchOutside(false);

表示する。

dialog.show();

却下する。

dialog.dismiss();
41
Abhi

アクティビティAとアクティビティBの2つのアクティビティを切り替える問題がありました。アクティビティBには、UIを更新するタスクが長時間実行されていたため、AsyncTaskの候補ではありませんでした。最初のアクティビティを完了する前に、アクティビティAで進捗ダイアログを起動し、アクティビティBを起動することで解決しました。コードは次のようになります。

            // wrap thread around original code for progress button
            final ProgressDialog ringProgressDialog = ProgressDialog.show(getActivity(), "Working", "Please Wait",
                    true, false);
            ringProgressDialog.setIndeterminate(true);
            new Thread(new Runnable() {
                public void run() {
                    try {

                        Intent startNewActivityOpen = new Intent(getActivity(), ActivityB.class);
                        startNewActivityOpen.setFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
                        startActivity(startNewActivityOpen);
                        GlobalVars.navigateFromScreen = true;

                        Thread.sleep(3000);


                        if (ringProgressDialog != null && ringProgressDialog.isShowing()) {
                            ringProgressDialog.dismiss();
                        }

                        getActivity().finish();


                    } catch (Exception e) {

                    }

                }

            }).start();
1
Kristy Welsh