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:
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");
}
}
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
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();
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();