是否有必要从 Firebase 实时数据库中删除每个添加的侦听器?

Is it necessary to remove each added listener from Firebase Realtime Database?

据我所知,必须通过调用 removeEventListener() 来删除 Firebase 实时数据库中的每个附加侦听器。假设我将一个侦听器附加到协程内的一个节点,然后如果我取消协程,那么我的应用程序将停止侦听数据库。例如:

viewModelScope.launch {
    Firebase.database.reference.child("users").addValueEventListener(usersListener) //usersListener is a ValueEventListener
}

在那种情况下,监听器会被移除吗?或者我也应该明确删除监听器?如果我不删除附加的侦听器会怎样?他们在那里待多久?

不需要删除它们,因为它会抛出错误并且您可以捕获错误。但是,建议您在不需要时清理您的侦听器以防止它们重新触发,因为您通常只是删除对该侦听器的引用。

从技术上讲,在后台,每个客户端都会通过网络套接字监听所有 'listen' 事件,并且在取消注册监听器之前,它会尝试继续监听应用程序的更改状态,这可能会导致更高的读取量,内存泄漏和一般性能问题。

当您使用“addValueEventListener()”时,这意味着您将一个持久性侦听器附加到数据库中的特定位置以实时获取数据。是否在协程上下文中添加侦听器并不重要,您始终需要 .

如果不需要实时更新,可以使用addListenerForSingleValueEvent(),如:

Adds a listener for a single change in the data at this location.

所以根本不需要删除任何侦听器。

你也可以使用相对较新添加的get()方法,如我的一篇文章所述:

如果不删除监听器会发生什么情况?

然后它将一直继续收听。在 Android 上下文中,侦听器对 Android activity 生命周期一无所知。所以如上所述,所以你必须在正确的时间明确地删除它,所以它不会导致意外的结果和崩溃。