如某些答案中所述:
在Android上,Firebase会自动管理连接状态,以减少带宽和电池使用量。当客户端没有活动侦听器,没有挂起的写入或onDisconnect操作,并且没有通过goOffline方法明确断开连接时,Firebase会在60秒不活动后关闭连接。
问题是在60年代之后,甚至在我使用完整的新引用,事件监听器等进行活动之后。它仍然表示它是断开连接,而事实上它并非如此。
val connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected")
var connectListener : ValueEventListener? = null
fun checkConnection() {
connectListener = connectedRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val connected = snapshot.getValue(Boolean::class.java)!!
if (connected) {
Log.d("FRAG", "CONNECTED")
else{
Log.d("FRAG", "DISCONNECTED")
}
}
override
fun onCancelled(error: DatabaseError) {
System.err.println("Listener was cancelled")
}
})
}
override fun onDetach() {
super.onDetach()
if (connectListener != null){
connectedRef.removeEventListener(connectListener)
}
}
如何确保维护或创建与Firebase的新连接?我会在每个checkConnection
片段和onAttach
活动中调用onStart
方法。
答案 0 :(得分:0)
如果您对从服务器读取的任何数据都有活动侦听器,则连接应保持打开状态,除非您在代码中明确调用了.info/connected
。请注意,push()
本身不需要从服务器读取,因此不会保持连接打开。
您似乎正在使用实时数据库在其他基于Firestore的应用上构建在线状态系统。在这种情况下:Cloud Firestore使用基于gRPC的协议在客户端和服务器之间进行通信,而Firebase实时数据库使用Web套接字。它们绝不兼容甚至不具有可比性。在Firestore中保持数据的主动侦听器不会保持与RTDB的连接打开。这就是example in the Firestore documentation也将实际数据节点写入实时数据库的原因。
答案 1 :(得分:0)
Stream<Event> checkInternetConectivity() {
Stream<Event> connectivityCheck = _firebaseDatabase.reference().child('.info/connected').onValue;
Stream<Event> randomCheck = _firebaseDatabase.reference().child('connected').onValue;
return Rx.combineLatest2(connectivityCheck, randomCheck,(connectivityCheck, _) => connectivityCheck as Event);}
}
如果没有活动侦听器并且侦听“.info/connected”不足以保持连接处于活动状态,Firebase 会在 60 秒后自动断开与 android 中的实时数据库的连接。创建另一个流来侦听实时数据库中的随机节点,以解决此自动断开连接问题。
这是我在 Dart/Flutter 中解决此问题的方法