android - 完成后如何访问 onDataChange 返回的值?
问题描述
我正在努力访问从数据库返回的信息onDataChange
。我知道这是由于它的异步性质,但我需要将这些值存储在某个地方以便在代码完成后访问。
我在 Firebase 数据库中存储了一个user
存储lat
和lng
定位的子级。然后我的代码按如下方式检索它:
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
如果我将所有代码移动到方法内部以显示我的位置,则不会显示设置的其他标记。我需要有关如何完成它的建议。
解决方案
首先简单地声明一个 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!!))
}
}
推荐阅读
- c++ - OpenCL 使用不同的 DEFINE ( -D ) 重用 cl_kernel
- dialogflow-es - 手动调用登录助手后继续对话
- python - 使用 iloc 不断选择多个数据文件的最后一行
- python - 条件布尔 Loc 索引 VS ISIN 索引
- javascript - Parse Server Javascript 支持嵌套的 select() 调用不起作用
- php - 注册表单无法验证
- javascript - jQuery 将 ID 转移到同一个父元素的另一个元素
- sql - ORA-12154: TNS: 无法解析指定的连接标识符 - 连接到远程数据库
- owin - 向 Idp-Sustainsys Saml2 发送登录请求
- angular - 在 Angular/RxJs 中,如何捆绑 http 请求,以便一个捆绑包包含多个请求(http://test/1、http://test/2 等)