Как узнать, использовать ли OnComplete или OnSuccess?

Я попытался найти для него ответ онлайн, но я не смог найти тот, который специфичен для реализаций Firebase.

Я могу выбрать между OnCompleteListener и OnSuccessListener для большого количества операций в Firebase, и я хотел бы знать, как я могу выбирать между ними?.

Я прочитал документацию для OnComplete и OnSuccess, но, как я могу видеть из Firebase документаций, этот, например, для одной конкретной операции (например, get работу в примере), они иногда используют OnSuccessListener, а иногда они используют OnCompleteListener.

Как я могу узнать, какой из них лучше в любой ситуации? Это имеет значение? Учитывая, что я хотел бы знать для каждой операции, если это было неудобно или нет.

Ответ 1

Как следует из названия, onSuccess() будет срабатывать, когда задача будет выполнена успешно.

onComplete() будет срабатывать, когда задача будет завершена, даже если она не удалась.

В методе вы можете вызвать Task.isSuccessful() и Task.getException().

В onSuccess() вы можете быть уверены, что isSuccessful() вернет true, а getException() вернет null (поэтому их не так много, чтобы вызвать их).

В onComplete() isSuccessful() может быть false, и у вас есть возможность справиться с этой getException(), возможно, используя getException() чтобы получить более подробную информацию.

Если вам нужно обрабатывать неудавшиеся задачи (и вы должны!), У вас есть два варианта:

  1. Использовать и OnCompleteListener, и if(task.isSuccessful()) {... } else {...} - это ставит код успеха и отказа рядом и может быть полезным, если эти подпрограммы разделяют состояние.
  2. Используйте отдельный OnSuccessListener и OnFailureListener - это позволяет вам писать слушатели с большей степенью сплоченности, поскольку каждый обработчик специализируется на одном. Конечно, один класс может реализовать оба интерфейса, давая вам другой способ увидеть оба состояния.

Ответ 2

Чтобы добавить к тому, что тонкий ответил выше в моем использовании Firebase. Я узнаю, что эти два слушателя (OnCompleteListener и OnSuccessListener)

Имеют разные времена обратного вызова при записи данных на свои серверы.

Общее правило

Если вы полагаетесь на систематический (последовательный) способ записи на серверы, чтобы выполнить некоторую логику, используйте OnCompleteListener

Если вы не зависите от систематических (не последовательных, т.е. асинхронных задач) способов записи на серверы, чтобы выполнить некоторую логику, используйте OnSuccessListener

Ответ 3

Иногда вы можете обнаружить, что вам нужно использовать значение результата, например, например, получение токена устройства... только onSuccess даст InstanceIdResult, а не onComplete... поэтому вы должны использовать onSuccess...

// Get The Device Token And Put It Into Firebase Instance
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
    @Override
    public void onSuccess(InstanceIdResult instanceIdResult) {

        String DeviceToken = instanceIdResult.getToken();

    }
});