【问题标题】:How do I know whether to use OnComplete or OnSuccess?我如何知道是使用 OnComplete 还是 OnSuccess?
【发布时间】:2017-10-09 14:44:52
【问题描述】:

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

对于Firebase 中的很多操作,我可以在OnCompleteListenerOnSuccessListener 之间进行选择,我想知道如何在它们之间进行选择?。

我已经阅读了 OnCompleteOnSuccess 的文档,但正如我从 Firebase 文档中看到的,this one 例如,对于一项特定操作(例如示例中的 get 操作),他们有时使用OnSuccessListener,有时他们使用OnCompleteListener

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

【问题讨论】:

    标签: java firebase


    【解决方案1】:

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

    onComplete() 将在任务完成时触发,即使它失败了。

    在方法中可以调用Task.isSuccessful()Task.getException()

    onSuccess() 中,您可以确定isSuccessful() 将返回true,而getException() 将返回null(因此调用它们没有多大意义)。

    onComplete()isSuccessful()可能是false,你有机会处理失败,也许使用getException()来获取更多细节。

    如果您需要处理失败的任务(您应该这样做!),您有两种选择:

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

    【讨论】:

    • 这对这两种方法都有很好的解释,但并没有真正回答为什么(何时)使用其中一种方法。我想如果你真的关心 OOP 原则,你会选择 OnSuccess,以增加凝聚力。
    【解决方案2】:

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

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

    一般经验法则

    如果您依赖系统(顺序)方式写入服务器以便 执行一些逻辑然后使用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();
      
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2014-12-20
        • 2016-10-07
        • 1970-01-01
        • 1970-01-01
        • 2014-09-11
        • 2013-01-30
        • 1970-01-01
        • 2010-10-08
        • 2016-11-17
        相关资源
        最近更新 更多