Как выполнить операцию удаления () в Firestore при выходе из действия? - PullRequest
1 голос
/ 11 декабря 2019

Мне нужно удалить 2 документа из 2 коллекций (без сбоев) каждый раз, когда я выхожу из определенного действия.

Я написал следующий код в onStop (), но это приводит к ошибке для super.onStopне вызывается.

@Override
protected void onStop() {
       db.collection("ABC").document("123").delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {

                db.collection("XYZ").document("123").delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        progressDialog.dismiss();
                        MyActivity.super.onStop();
                        finish();
                    }
                });
            }
        });
}

Ответы [ 2 ]

1 голос
/ 11 декабря 2019

, но это приводит к ошибке при вызове super.onStop.

Это происходит потому, что вы размещаете следующую строку кода:

MyActivity.super.onStop();

Внутри второго onComplete() метода, который имеет асинхронное поведение. Чтобы решить эту проблему, вы должны получить эту строку из обратных вызовов, как в следующих строках кода:

@Override
protected void onStop() {
    MyActivity.super.onStop(); //Added outside
    db.collection("ABC").document("123").delete().addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {

            db.collection("XYZ").document("123").delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    progressDialog.dismiss();
                    finish();
                }
            });
        }
    });
}

Видите, вызов super.onStop() находится за пределами обоих обратных вызовов.

0 голосов
/ 11 декабря 2019

В вашем подходе вы пытаетесь вызвать фоновое событие в onStop() и пытаетесь вызвать super.onStop () после выполнения фоновой работы.

Есть несколько вещей, которые делают этот подходнедопустимый

  • onStop() метод может использоваться для запуска фонового события, но мы не можем заставить метод onStop() ждать, пока фоновая работа не будет выполнена. Это относится ко всем методам жизненного цикла.
  • Нельзя использовать onStop(), поскольку метод onStop вызывается всякий раз, когда пользовательский интерфейс невидим для пользователя, это может происходить во многих случаях, кроме выхода из операции.

Решение

В идеале, чтобы выполнить некоторую работу при выходе из действия, вы можете использовать метод ViewModel onCleared(), но поскольку вы не используете ViewModels, другойопция onDestroy().

@Override
protected void onDestroy() {
    super.onDestroy();
    db.collection("ABC").document("123").delete().addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {

            db.collection("XYZ").document("123").delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                }
            });
        }
    });
}

Поскольку мы используем onDestroy(), мы не можем ждать, пока будет выполнена фоновая работа, и есть еще одна проблема, которая не гарантированно вызывается onDestroy. В некоторых случаях onDestroy () не будет вызываться при завершении активности.

Я бы предпочел использовать метод onCleared() ViewModel вместо onDestroy(), потому что onDestroy будет вызываться даже при изменении ориентации,что не идеально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...