Firebase Android - 如何判断节点是否已同步

6
我正在使用Firebase for Android来实现我们应用程序的聊天组件。我遇到了一些困难,无法可靠地实现每条聊天消息的状态更新。例如,在与服务器同步聊天时显示“正在发送...”,并在同步后提供成功反馈。
我有一个onChildAdded监听器,它为我的适配器提供消息。然而,当每个节点在本地添加时,此监听器会立即触发,并且我无法检查每个节点的状态。
我的当前解决方案是保留一组节点键,并在将某些内容推送到Firebase时添加键。然后,在setValue回调中,我从集合中删除节点键。但是,这非常不可靠,因为在调用活动被销毁等情况下,节点可能已经同步。
我想知道是否有更简单的方法来检查每个节点是否已同步到服务器?
谢谢!

1
我已经回答了下面的问题,但请您在下次提问时附上最小化可重现问题的代码。与对代码的描述相比,代码更易于解析。请参见http://stackoverflow.com/help/mcve - Frank van Puffelen
1个回答

6

来自Firebase关于写入数据的文档:

如果您想知道何时提交了数据,可以添加完成侦听器。setValue()和updateChildren()都需要一个可选的完成侦听器,当写入已提交到数据库时调用它。

以下是一个实用的代码示例:

ref.setValue("I'm writing data", new Firebase.CompletionListener() {
    @Override
    public void onComplete(FirebaseError firebaseError, Firebase firebase) {
        if (firebaseError != null) {
            System.out.println("Data could not be saved. " + firebaseError.getMessage());
        } else {
            System.out.println("Data saved successfully.");
        }
    }
});

2
是的,这是我目前使用的方法。但是如果我没有网络怎么办?那么这个监听器根本不会被调用,因为数据在网络打开时排队等待写入。同时,包含此回调的活动已被销毁。然后,我打开网络,以便完成写入。然后我回到活动。此时数据已同步,但回调从未触发。 - recipherus
澄清一下,当用户关闭活动时,数据将在后台同步。因此,此回调永远不会收到。 - recipherus
2
在应用程序的同一会话中,监听器通常仍然存在并被调用。如果您使用磁盘持久化并且应用程序重新启动,则这些监听器确实无法在重新启动后继续存在。 - Frank van Puffelen
如果服务器上的同一路径有更新(由其他客户端即Web应用程序更新),那么在数据下载和上传后,这个onComplete监听器会触发吗? - Shripad Bhat
由于代码已过时,应该使用new DatabaseReference.CompletionListener()替代new Firebase.CompletionListener() - August

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接