60秒后Firebase连接检测不起作用

时间:2018-03-05 15:55:52

标签: android firebase firebase-realtime-database kotlin

如某些答案中所述:

  

在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方法。

2 个答案:

答案 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 中解决此问题的方法