问题描述
我有一个获取附近用户的 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*
方法中检查该字段的值。