【问题标题】:How to access values returned by onDataChange after the its completion?完成后如何访问 onDataChange 返回的值?
【发布时间】:2018-07-07 18:55:32
【问题描述】:

我正在努力使用onDataChange 访问从数据库返回的信息。我知道这是由于它的异步特性,但我需要将这些值存储在某个地方,以便在代码完成后访问。

我在 Firebase 数据库中存储了一个 user 子级,它存储了 latlng 位置。然后我的代码按如下方式检索它:

override fun onDataChange(dataSnapshot: DataSnapshot) {
    var user: User?

    dataSnapshot.children.forEach {
        user = it.getValue(User::class.java)
        Log.d("Maps::user::lat", user?.lat.toString()) // Has info
        Log.d("Maps::user::lng", user?.lng.toString()) // Has info
        mMyLocation.latitude = user!!.lat!!
        mMyLocation.longitude = user!!.lng!!
    }
}

val location = LatLng(mMyLocation.latitude, mMyLocation.longitude) // 0.0 and 0.0

该应用程序不仅有我的位置,还有地图上的其他标记。如果我将所有代码移动到方法内部以显示我的位置,则不会显示在 onMapReady 中设置的其他标记。我需要有关如何完成它的建议。

【问题讨论】:

    标签: android firebase-realtime-database kotlin


    【解决方案1】:

    首先简单地声明一个 gloabl (witin class) 标记引用

    lateint var myLocMarker:Marker
    

    然后在谷歌地图中添加您的位置标记(onmapready 等)

    var a = MarkerOptions()
        .position(LatLng(50,6))) // any position, which you already have, i suppose 
    myLocMarker = map.addMarker(a)
    

    然后在onDataChange 内将标记位置更新为

    override fun onDataChange(dataSnapshot: DataSnapshot) {
        var user: User?
    
        dataSnapshot.children.forEach {
            user = it.getValue(User::class.java)
            Log.d("Maps::user::lat", user?.lat.toString()) // Has info
            Log.d("Maps::user::lng", user?.lng.toString()) // Has info
            mMyLocation.latitude = user!!.lat!!
            mMyLocation.longitude = user!!.lng!!
            myLocMarker.setPosition(LatLong(user!!.lat!!,user!!.lng!!))
        }
    }
    

    【讨论】:

    • 它是这样工作的,但其他标记仍未设置。我肯定会使用另一个onDataChange。 2个以上可以吗?我将设置为正确,因为它解决了我的位置问题。
    • 是的,您可以进行多个数据更改,尽管您也可以在某些根注释上应用列表器以获取数据,但我不确定为什么其他标记存在问题,如您所知,我们可以添加为你想要很多标记,你只需要有正确的纬度。很高兴我能帮上忙,编码愉快
    • 我真的需要让来自onDataChange 的结果在其范围之外可用,因为在onCreate 中,作为一个虚拟测试,我设置了我自己位置的硬编码值,并且从该位置,我检查其他虚拟位置是否在配置的半径内。由于尝试将传入的纬度和经度分配给我的 Location 变量一旦超出范围就会导致 null,因此其他标记将不会显示。
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多