完成后如何访问onDataChange返回的值?

时间:2018-07-07 18:55:32

标签: android firebase-realtime-database kotlin

我正在努力使用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中设置的其他标记。我需要有关如何实现的建议。

1 个答案:

答案 0 :(得分:1)

首先只需声明一个gloabl(类)标记引用

lateint var myLocMarker:Marker

然后将您的位置标记添加到Google地图(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!!))
    }
}