Firebase监听器实际上是如何工作的?

16

我在想,在安卓上,当你向数据库添加监听器时,底层实际机制是如何工作的?它只是更频繁地拉取数据或有其他特殊操作吗?

更新: 为了让问题更清晰,我知道什么是监听器,但我的意思是“监听”方案是如何工作的,客户端(安卓)如何知道服务器上的数据已更改。这只是定期拉取吗?(Firebase的工程师已经完成了艰苦的工作,并使其易于我们使用)。

看起来Firebase不是开源的。

// Attach an listener to read the data at our posts reference
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        System.out.println(snapshot.getValue());
    }
    @Override
    public void onCancelled(FirebaseError firebaseError) {
        System.out.println("The read failed: " + firebaseError.getMessage());
    }
});
3个回答

31

免责声明:本文是在撰写时对事物运作方式的简化描述。随着时间的推移,可能已发生变化。

当你的应用连接到Firebase数据库时,它会从设备向Firebase服务器打开一个网络套接字连接。这个连接将在您的应用程序的生命周期内保持打开状态,或者直到您调用goOffline()

当您附加监听器时,客户端会将位置(和潜在的查询参数)发送到服务器。服务器将该监听器添加到所有连接的客户端的所有监听器列表中。它还会返回该监听器的初始数据。

每当写入操作提交到数据库时,服务器会扫描监听器。对于每个相关的监听器,服务器都会通过打开的网络套接字将更新发送到客户端。


我已经标记为答案,但不知道像你说的那样它是否仍然有效 :) - EyeQ Tech
当启用持久化模式时会发生什么?因为当本地状态更改且您处于离线状态时,事件仍会触发。 - kirtan403
这在2019年仍然准确吗? - f.khantsis
没错,这仍然是它的工作原理。如果您有可能相关的问题,请使用最小化可重现问题的代码打开一个新问题。 - Frank van Puffelen

0

它是异步发生的

将监听器添加到节点引用将异步获取对节点引用所做的任何更改

void onDataChange(DataSnapshot snapshot)

此方法将使用此位置上数据的快照调用。每次数据更改时也会调用它。

void onCancelled(FirebaseError error)

如果此侦听器在服务器上失败或由于安全和Firebase规则而被删除,则将触发此方法。有关保护数据的更多信息,请参见:安全入门

示例

ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
    System.out.println(snapshot.getValue());
    Users users = snapshot.getValue(Users.class) //This is your POJO class
    String name = users.getName(); //Other getter methods to fetch data from firbase


}
@Override
public void onCancelled(FirebaseError firebaseError) {
    System.out.println("The read failed: " + firebaseError.getMessage());
}

});


谢谢,但我想查看Android(客户端)上的监听器如何知道中央Firebase上的数据已更改。 - EyeQ Tech
变化将是异步的,这就是事件监听器发挥作用的地方。 - Veeresh Charantimath

-1

在指南Firebase - Retrieve Data on Android中有详细解释。

当监听器被附加时,此方法会被触发一次,之后每当数据(包括子项)发生更改时都会再次触发。


谢谢,但我想查看Android(客户端)上的侦听器如何知道中央Firebase中的数据已更改。 - EyeQ Tech

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