在Firebase上使用.setPersistenceEnabled(true)时,真的需要.addOnCompleteListener吗?

时间:2019-03-12 03:57:26

标签: java firebase firebase-realtime-database

感谢好奇心!

我不确定在使用addOnCompleteListener时是否真的有必要调用setPersistence(true)

当我使用addOnCompleteListener时,如果我的Internet处于脱机状态,则屏幕会继续加载,因为addOnCompleteListener永远不会结束-等待连接。因此,我无法离线添加任何内容,因为加载屏幕正在等待连接(破坏了持久性的概念)。

以下示例显示了我在说什么:

getDatabaseReference()
        .child("Example")
        .child(userID)
        .push()
        .setValue(dataExample)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()){
            //interface call with success response
            interface.onSuccess();
        }else {
            //interface call with failure response
            interface.onFailure(task.getException().getMessage());
        }
    }
});

因此,正如我所说,如果我的Internet处于离线状态,我将无法完成操作,加载屏幕将永远永久加载(等待completelistener)。

我发现,没有addOnCompleteListener的情况下,我可以在脱机时添加和删除值,因为它们在缓存中,因此当我有互联网时,该应用程序会将更新在线发送到数据库中-很棒。

以下示例显示了我的建议:

 getDatabaseReference()
        .child("Example")
        .child(userID)
        .push()
        .setValue(dataExample);

 //interface call with successful response without handling error (because it won't happen)
 interface.onSuccess();

所以,我的问题是,这样做是对的吗? 这是一个好习惯吗? 如果没有addOnCompleteListener,并且可以离线使用我的应用程序,则仅在能够进行更新时发送更新?

1 个答案:

答案 0 :(得分:0)

您看到的是预期的行为。直到对RealtimeDatabase的写入到达服务器并且对其他客户端可见之后,才认为它是“完成”的。在SDK设法同步之前,本地缓存的写入才被认为是完整的。如果您不需要知道服务器最终何时接收到写入,或者是否成功,则无需在其生成的Task中注册侦听器。