Afficher le dialogue rouage lors du chargement des données sur Android

je veux afficher un dialogue de rouage pendant que mon application charge quelques données:

Spinning wheel dialog

la boîte de dialogue Rouet doit s'afficher sur un clic de bouton. J'utilise le code ci-dessous mais il montre maintenant le Rouet. Quel pourrait être le problème?

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");
    }
}
34
demandé sur Palec 2011-05-28 08:48:00

3 réponses

Alors, voyant que cette réponse devient de plus en plus upvotes, j'ai décidé que je devais prendre sur moi pour améliorer la qualité de la réponse. Lorsque je regarde l'original, je ne vois pas de réel "réponse" à la question "quel est le problème dans mon code?". Je laisse la réponse originale intacte ci-dessous pour préserver le lien, ce qui est ce que je suppose a causé la popularité des réponses.

"151970920 Mis" À La Réponse

il est probable que vous violez le 'single thread model'. Le Toolkit Android UI N'est pas threadsafe, et ne doit être manipulé qu'à partir du thread UI 'main'. Android a une poignée de méthodes utiles que vous pouvez utiliser pour vous assurer que vos manipulations UI sont faites sur le fil UI. La plupart des détails de ces appels de méthode peuvent être trouvés dans l'Android Indolore Filetage blog (lien dans le mot "one", ci-dessous, et ici rapide référence.)

en regardant votre code, la violation spécifique que je vois est qu'un ProgressDialog est créé dans ce qui est probablement le fil UI, qui est ensuite rejeté dans le fil arrière-plan nouvellement créé.

il serait préférable d'encapsuler votre méthode d'arrière-plan dans un Runnable et d'utiliser View#post(Runnable) pour faire le travail en arrière-plan.

rappelez-vous, Il ya plusieurs façons de faire arrière-plan, donc jetez un coup d'oeil à ce qui est disponible, et utilisez ce qui semble juste pour votre situation.

Réponse Originale À Cette Question

Prendre look à un de la beaucoup tutoriels comment faire asynchrone travail dans Android .

aussi, voici quelques autres questions de flux StackOverflow qui sont similaires

boîte de dialogue de Progression problème dans Android

dialogue de progrès sur l'activité ouverte

Dialog Progress while starting new activity

Android: progression Dialog spinner not spinning

Dialogue de progression de mise à jour

android: affichage d'un dialogue de progression

48
répondu nicholas.hauschild 2017-05-23 12:32:33
ProgressDialog dialog = new ProgressDialog(this); // this = YourActivity
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setMessage("Loading. Please wait...");
dialog.setIndeterminate(true);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
35
répondu Abhi 2016-02-05 22:53:49

j'ai eu le problème de passer entre deux activités, L'activité A et L'activité B. L'activité B comportait des tâches de longue durée qui mettaient à jour l'IU, de sorte qu'elle n'était pas candidate à L'AsyncTask. Je l'ai résolu en lançant un dialogue de progrès sur L'activité A et en lançant L'activité B avant que nous ayons terminé la première activité. Le Code ressemble à:

            // 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
répondu Kristy Welsh 2015-12-15 16:37:42