web-dev-qa-db-fra.com

Afficher la boîte de dialogue de la roue tournante lors du chargement des données sur Android

Je souhaite afficher une boîte de dialogue de rotation de la roue pendant que mon application charge des données:

Spinning wheel dialog

La boîte de dialogue de la roue tournante devrait apparaître sur un clic de bouton. J'utilise le code ci-dessous mais il montre maintenant la roue qui tourne. 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");
    }
}
38
Kris

Donc, voyant que cette réponse reçoit de plus en plus de votes positifs, j'ai décidé que je devais prendre sur moi d'améliorer la qualité de la réponse. En regardant l'original, je ne vois aucune vraie "réponse" à la question "quel est le problème dans mon code?". Je laisse la réponse originale intacte ci-dessous pour préserver la liaison, ce qui est, je suppose, à l'origine de la popularité des réponses.

Réponse mise à jour

Il est probable que vous violiez le "modèle à fil unique". Android UI Toolkit n'est pas threadsafe, et ne doit être manipulé qu'à partir du thread d'interface utilisateur principal. Android a une poignée de méthodes utiles que vous pouvez utiliser pour assurez-vous que vos manipulations d'interface utilisateur sont effectuées sur le thread d'interface utilisateur. La plupart des détails de ces appels de méthode peuvent être trouvés dans le Android blog indolore Threading (lié dans le mot "un" ci-dessous, et ici pour référence rapide).

En regardant votre code, la violation spécifique que je vois est qu'un ProgressDialog est en cours de création dans ce qui est probablement le thread d'interface utilisateur, qui est ensuite rejeté dans le thread d'arrière-plan nouvellement créé.

Vous feriez mieux d'encapsuler votre méthode d'arrière-plan dans un Runnable et d'utiliser View#post(Runnable) pour effectuer le travail en arrière-plan.

N'oubliez pas, il existe de nombreuses façons de faire le contexte, alors jetez un œil à ce qui est disponible et utilisez ce qui vous convient le mieux.

Réponse originale

Prenez un regardez à n des plusieurstutoriels de la façon de faire asynchrone - travail dans Android .

En outre, voici quelques autres questions sur StackOverflow qui sont similaires

Problème de dialogue de progression dans Android

Dialogue de progression sur l'activité ouverte

Dialogue de progression lors du démarrage d'une nouvelle activité

Android: le spinner de dialogue de progression ne tourne pas

Boîte de dialogue de progression de la mise à jour

Android: affichage d'une boîte de dialogue de progression

49

Créer.

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);

Montrer.

dialog.show();

De rejeter.

dialog.dismiss();
41
Abhi

J'ai eu le problème de basculer entre deux activités, l'activité A et l'activité B. L'activité B avait de longues tâches de mise à jour de l'interface utilisateur, donc ce n'était pas un candidat pour AsyncTask. Je l'ai résolu en lançant une boîte de dialogue de progression sur l'activité A et en lançant l'activité B avant de terminer 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
Kristy Welsh