我有一个Android服务,可通过onCreate
调用此服务:
FirebaseDatabase database = FirebaseDatabase.getInstance();
database.getReference(".info/connected").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Log.d(TAG, "connected: " + snapshot.getValue(Boolean.class));
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.w(TAG, "Failed to read value.", error.toException());
}
});
我注意到,当我进行大量的wifi和蜂窝数据切换时,最终会看到“ connected:false”消息,而没有“ connected:true”消息。除了Firebase实时数据库外,我还在该服务中运行Firestore,并且Firestore此时已正确连接。
然后我触发Android服务来运行以下代码:
FirebaseDatabase.getInstance().getReference("random/data").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
boolean connected = snapshot.getValue(Boolean.class);
Log.d(TAG, "random data: " + connected);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
// Failed to read value
Log.w(TAG, "cancelled system/online.", error.toException());
}
});
现在,我成功读取了 并打印了“ connected:true”。
发生了什么事?为什么我需要从Firebase读取.info/connected
才能触发?
答案 0 :(得分:2)
为什么我需要从Firebase读取
.info/connected
才能触发?
答案停留在offical documentation:
Firebase实时数据库在
/.info/connected
上提供了一个特殊位置,每次Firebase实时数据库客户端的连接状态更改时,该位置都会更新。
/.info/connected
是一个布尔值,在实时数据库客户端之间不不同步,因为该值取决于客户端的状态。换句话说,如果一个客户端将/.info/connected
读为false,则不能保证另一个客户端也将读为false。在Android上,Firebase自动管理连接状态以减少带宽和电池消耗。如果客户端没有活动的侦听器,没有挂起的写操作或onDisconnect操作,并且没有通过
goOffline
方法显式断开连接,则Firebase在闲置60秒后将关闭连接。
因此,在Android上,您还可以利用连接状态管理。因此,一旦实现了上述解决方案,您将看到,如果没有连接侦听器并且最后在应用程序中没有使用setValue()
进行写操作,SDK将以一种自动断开连接的方式来动态管理此操作60秒,但是ValueEventListners
的存在将覆盖此设置,并确保与数据库的持续连接。您也可以查看此post中的答案。
还有另外一个post,建议您阅读以更好地理解。