Pour le moment, j'utilise un gestionnaire de système d'exploitation Android qui fonctionne pendant 3 secondes. Le problème est que je ne sais pas combien de temps le fonctionnement du réseau prendra réellement. Existe-t-il un moyen d'arrêter la boîte de dialogue de progression uniquement lorsque les 200 messages ont été supprimés?
Gestionnaire:
new android.os.Handler().postDelayed(
() -> {
// On complete call delete contact method
deleteAllMsgs(progressDialog);
// onLoginFailed();
}, 3000);
Méthode:
private void deleteAllMsgs(ProgressDialog progressDialog) {
ParseQuery<ParseObject> msgQuery= new ParseQuery<>(ParseConstants.CLASS_MESSAGE);
// Query the Comment class for comments that have a "author" column value equal to the objectId of the current User
msgQuery.whereEqualTo((ParseConstants.KEY_SENDER_AUTHOR_POINTER), ParseUser.msgQuery());
yeetQuery.setLimit(200);
msgQuery.findInBackground((messages, e) -> {
if (e == null) {
// Iterate over all messages
for (ParseObject delete : messages) {
// Delete messages from local data store
try {
delete.unpin();
} catch (ParseException e1) {
e1.printStackTrace();
}
// Delete messages from Parse
delete.deleteInBackground();
}
// Return to main screen
Toast.makeText(getApplicationContext(), "200 messages deleted", Toast.LENGTH_SHORT).show();
finish();
} else {
Log.e("Error", e.getMessage());
}
});
}
3 réponses
ProgressDialog progress = new ProgressDialog(getApplicationContext());
progress.setTitle("In Progress");
progress.show();
AsyncTask.execute(new Runnable() {
@Override
public void run() {
//Do things.
runOnUiThread(new Runnable() {
@Override
public void run() {
//Update UI.
}
});
//Do things.
runOnUiThread(new Runnable() {
@Override
public void run() {
progress.dismiss();
}
});
}
});
progress.setOnDismissListener(newDialogInterface.OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialogInterface) {
//Called after your background task ended.
}
});
Vous pouvez utiliser la méthode runOnUiThread autant que vous le souhaitez dans la méthode asynctask. Avec cela, vous pouvez envoyer un message toast, définir le texte d'une vue de texte, etc.
Au lieu d'utiliser le gestionnaire du système d'exploitation, vous devez utiliser la méthodologie de tâche Asynch, référence ici https://www.concretepage.com/android/android-asynctask-example-with-progress-bar.
Ici pas nécessairement pour utiliser "progressUpdate ()", sans cela, vous pouvez également le faire.
Vous pouvez donc mettre l'initialisation du progressdialog dans "preExecute ()",
Puis mettez votre "deleteAllMessage ()" dans doInBackguound () et
Une fois la tâche terminée, elle passera automatiquement à "postExecute ()".
Vous pouvez donc arrêter d'afficher la barre de progression. En appelant:
progressdialog.stop()
Existe-t-il un moyen d'arrêter la boîte de dialogue de progression uniquement lorsque les 200 messages ont été supprimés?
Oui, vous devez utiliser correctement le rappel de Parse.
Placez votre code "après les messages supprimés" immédiatement après la boucle for sur les messages plutôt que hors du rappel
Et vous n'avez pas besoin d'un gestionnaire ou d'Asynctask pour ParseQuery.findInBackground ou deleteInBackground
De plus, vous devriez utiliser deleteAllInBackground(List<T> objects, DeleteCallback callback)
avec un rappel pour savoir quand une liste d'objets est supprimée plutôt que d'avoir à les trouver d'abord
De nouvelles questions
java
Java est un langage de programmation de haut niveau. Utilisez cette balise lorsque vous rencontrez des problèmes pour utiliser ou comprendre la langue elle-même. Cette balise est rarement utilisée seule et est le plus souvent utilisée en conjonction avec [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] et [maven].