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());
            }
        });
    }
1
Martin Erlic 25 nov. 2017 à 03:20

3 réponses

Meilleure réponse
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.

1
Yusuf Çağlar 25 nov. 2017 à 00:40

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()
1
Ankit Patidar 25 nov. 2017 à 00:31

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

1
OneCricketeer 25 nov. 2017 à 00:46
47481498