【问题标题】:GeoFire removeAllListeners() method not removing the listener at allGeoFire removeAllListeners() 方法根本不删除监听器
【发布时间】:2021-06-01 15:36:04
【问题描述】:

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

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

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?) {
            }
        })

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database geofire


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨弗兰克,非常感谢您回答我的问题。也许我以错误的方式处理问题。我正在尝试实现分页之类的功能。在指定半径内,我的 firebase 数据库中将轻松拥有超过 10,000 条记录。我真的不想在我的 android 设备上加载所有 10,000 条记录。我想先加载 2000 左右,然后再加载下一组,依此类推。您能否就我如何实现这一目标提供一些指导? (我想过从小半径开始并不断增加它,但这也不能解决我的问题)
    • 常用的方法是从一个较小的范围开始,然后逐渐增加它,但是由于您也排除了这一点,因此 GeoFire 在这里可能无法为您做很多事情。你可能想看我几年前做的这个演讲,以了解为什么这个库(以及其他基于 geohashes 的库)比你要找的更有限:youtube.com/watch?v=mx1mMdHBi5Q
    • 知道了。谢谢
    猜你喜欢
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多