Android Firebase连接检测在60秒后不工作
正如一些答案所解释的: 在Android上,Firebase自动管理连接状态以减少带宽和电池使用。当客户端没有活动侦听器,没有挂起的写入或onDisconnect操作,并且没有通过goOffline方法显式断开连接时,Firebase会在60秒不活动后关闭连接 问题是在60年代之后,甚至在我使用一个全新的引用、事件监听器等进行活动之后。。它仍然说它是断开的,而事实上它不是Android Firebase连接检测在60秒后不工作,android,firebase,firebase-realtime-database,kotlin,Android,Firebase,Firebase Realtime Database,Kotlin,正如一些答案所解释的: 在Android上,Firebase自动管理连接状态以减少带宽和电池使用。当客户端没有活动侦听器,没有挂起的写入或onDisconnect操作,并且没有通过goOffline方法显式断开连接时,Firebase会在60秒不活动后关闭连接 问题是在60年代之后,甚至在我使用一个全新的引用、事件监听器等进行活动之后。。它仍然说它是断开的,而事实上它不是 val connectedRef = FirebaseDatabase.getInstance().getReference
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
一个活动。如果您对从服务器读取的任何数据有一个活动的侦听器,除非您在代码中显式调用了goOffline()
,否则连接应该保持打开。请注意,.info/connected
本身不需要从服务器读取,因此不会保持连接打开
您似乎正在使用实时数据库在基于Firestore的应用程序上构建状态系统。在这种情况下:CloudFireStore使用基于gRPC的协议在客户端和服务器之间进行通信,而Firebase实时数据库使用web套接字。它们根本不相容,甚至不可比。保持Firestore中数据的活动侦听器不会保持与RTDB的连接处于打开状态。这就是为什么还将实际的数据节点写入实时数据库。I如果从服务器读取的任何数据都有活动侦听器,则连接应保持打开状态,除非您在代码中显式调用了
goOffline()
。请注意,.info/connected
本身不需要从服务器读取,因此不会保持连接打开。这听起来有点像:我感觉整个.info/connected
和超时都是些骗人的东西。你能描述一下真正的根本问题是什么吗?@FrankvanPuffelen,我只想让它跟踪连接状态。因此,如果我停留在X屏,关闭wifi/互联网连接,X屏应该显示“无互联网连接”视图。如果我再次打开连接,它将淡出“无internet连接”视图。问题在于60秒后它不再跟踪连接状态。我们不要只关注60秒的设置,因为行为取决于多个因素。如果您关闭wifi/internet,过一段时间后,您在connectedRef
上的侦听器应以“false”值启动。这不是真的吗?还是比你想象的要晚?在60秒内一切正常。在此之后,它只是断开连接并保持值为false
。奇怪的行为是,为了解决这个问题,我会删除frag和onDestroy活动的onDetach
上的侦听器,然后将其分别放在OnTach
/onStart
上,它会工作一段时间,但有时它会显示为断开连接。所以,整个问题是,当听同一个监听器时,60秒后它总是指向断开连接(connected=false
)。续订侦听器时,有时它也会保持断开状态。如果您只有.info/connected
上的侦听器,则不会保持与服务器的连接。这是故意的。