GeoFire removeAllListeners() 方法根本没有删除监听器

问题描述

我有一个获取附近用户的 geofire 查询。一切正常,但如果 pagingCounter 达到特定限制,我想停止收听新事件。我在 geoQuery.removeAllListeners() 方法添加onKeyEntered() 但这并没有删除侦听器。事件仍在获取并且 onKeyEntered() 方法不断被调用,直到它读取数据库中的所有元素。

请帮我找出我做错了什么。提前致谢!

var pagingCounter = 0
        val geoQuery = geoFire.queryAtLocation(GeoLocation(mainUserLatitude,mainUserLongitude),distanceInKm)

        geoQuery.addGeoQueryEventListener(object : GeoQueryEventListener {

            override fun onGeoQueryReady() {
                for ((key,value) in nearByUsersKeyStreemap) {
                    val singleUserDatabaseReference = database.child(Constants.users).child(key)

                    singleUserDatabaseReference.addListenerForSingleValueEvent(object : ValueEventListener {

                        override fun onCancelled(p0: DatabaseError) {

                        }

                        override fun onDataChange(dataSnapshot: DataSnapshot) {

                        }
                    })
                }
            }

            override fun onKeyEntered(key: String?,location: GeoLocation?) {

                pagingCounter++

                if (pagingCounter >= 100) {
                    geoQuery.removeAllListeners()
                }
            }

            override fun onKeyMoved(key: String?,location: GeoLocation?) {
            }

            override fun onKeyExited(key: String?) {
            }

            override fun onGeoQueryError(error: DatabaseError?) {
            }
        })

解决方法

如果这些都是最初在范围内的键,那么您看到的是预期的行为。从数据库中检索最初在范围内的所有键是一项无法中断的操作。

调用 removeAllListeners 会阻止从数据库中检索对键的进一步更新,但客户端仍会为其已收到数据的所有侦听器触发事件​​。

如果您不想再响应这些事件,您可以使用您在调用 removeAllListeners 时设置的字段,然后在 onKey* 方法中检查该字段的值。