我试图在网上找到答案,但我找不到一个特定于Firebase
实现的答案。
我可以在OnCompleteListener
和OnSuccessListener
之间选择Firebase
中的大量操作,我想知道如何在它们之间进行选择?
我已阅读OnComplete和OnSuccess的文档,但正如我在Firebase文档中看到的那样this one,例如,针对一个特定操作(如get
操作在示例中),他们有时使用OnSuccessListener
,有时他们使用OnCompleteListener
。
我如何知道哪种情况在各种情况下都更好? 有关系吗?考虑到我想知道每一项操作是否成功。
答案 0 :(得分:25)
顾名思义,onSuccess()
将在任务成功完成时触发。
onComplete()
也会触发。
在该方法中,您可以拨打Task.isSuccessful()
和Task.getException()
。
在onSuccess()
中,您可以确定isSuccessful()
将返回true,getException()
将返回null(因此调用它们的次数不多)。
onComplete()
isSuccessful()
可能是false
,您有机会处理失败,可能使用getException()
来获取更多详细信息。
如果你需要处理失败的任务(你应该!),你有两个选择:
OnCompleteListener
以及if(task.isSuccessful()) { ... } else {...}
- 这会将成功和失败代码放在一起,如果这些例程共享状态可能会有用。OnSuccessListener
和OnFailureListener
- 这允许您编写具有更多内聚力的侦听器,因为每个处理程序都专注于一件事。当然,一个类可以实现两个接口,为您提供另一种方法,让两者都看到相同的状态。答案 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上面回答的问题。
我发现这两个听众(OnCompleteListener
和OnSuccessListener
)
将数据写入服务器时有不同的回调时间。
一般经验法则
如果您依靠系统(顺序)的方式写入服务器以便
执行一些逻辑,然后使用OnCompleteListener
如果您不依赖于系统(非顺序,即异步任务)的方式写入服务器,以便
执行一些逻辑,然后使用OnSuccessListener