我如何知道是使用OnComplete还是OnSuccess?

时间:2017-10-09 14:44:52

标签: java firebase

我试图在网上找到答案,但我找不到一个特定于Firebase实现的答案。

我可以在OnCompleteListenerOnSuccessListener之间选择Firebase中的大量操作,我想知道如何在它们之间进行选择?

我已阅读OnCompleteOnSuccess的文档,但正如我在Firebase文档中看到的那样this one,例如,针对一个特定操作(如get操作在示例中),他们有时使用OnSuccessListener,有时他们使用OnCompleteListener

我如何知道哪种情况在各种情况下都更好? 有关系吗?考虑到我想知道每一项操作是否成功。

3 个答案:

答案 0 :(得分:25)

顾名思义,onSuccess()将在任务成功完成时触发。

任务完成后,即使失败,

onComplete()也会触发。

在该方法中,您可以拨打Task.isSuccessful()Task.getException()

onSuccess()中,您可以确定isSuccessful()将返回true,getException()将返回null(因此调用它们的次数不多)。

onComplete() isSuccessful()可能是false,您有机会处理失败,可能使用getException()来获取更多详细信息。

如果你需要处理失败的任务(你应该!),你有两个选择:

  1. 使用和OnCompleteListener以及if(task.isSuccessful()) { ... } else {...} - 这会将成功和失败代码放在一起,如果这些例程共享状态可能会有用。
  2. 使用单独的OnSuccessListenerOnFailureListener - 这允许您编写具有更多内聚力的侦听器,因为每个处理程序都专注于一件事。当然,一个类可以实现两个接口,为您提供另一种方法,让两者都看到相同的状态。

答案 1 :(得分:1)

有时您可能会发现需要使用结果的值,例如获取设备令牌。.仅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();

    }
});

答案 2 :(得分:0)

在我使用Firebase时添加slim上面回答的问题。 我发现这两个听众(OnCompleteListenerOnSuccessListener

将数据写入服务器时有不同的回调时间。

一般经验法则

如果您依靠系统(顺序)的方式写入服务器以便 执行一些逻辑,然后使用OnCompleteListener

如果您不依赖于系统(非顺序,即异步任务)的方式写入服务器,以便 执行一些逻辑,然后使用OnSuccessListener

相关问题