Android 如何等待Firebase DB完成加载?
我在预加载数据库时遇到了一个问题,从中创建了一个列表,然后应该显示在一个片段中。如果我运行函数并等待几秒钟,那么一切都正常(例如,在mineActivity启动时启动函数,然后调用显示列表的片段)。但是我想在每次调用带有此列表的片段时运行该函数,但我不知道如何跟踪列表的填充以及从数据库接收信息的完成情况。因此,列表显示为空Android 如何等待Firebase DB完成加载?,android,firebase,kotlin,firebase-realtime-database,Android,Firebase,Kotlin,Firebase Realtime Database,我在预加载数据库时遇到了一个问题,从中创建了一个列表,然后应该显示在一个片段中。如果我运行函数并等待几秒钟,那么一切都正常(例如,在mineActivity启动时启动函数,然后调用显示列表的片段)。但是我想在每次调用带有此列表的片段时运行该函数,但我不知道如何跟踪列表的填充以及从数据库接收信息的完成情况。因此,列表显示为空 fun initUserTracks() { executor = Executors.newSingleThreadExecutor() var userT
fun initUserTracks() {
executor = Executors.newSingleThreadExecutor()
var userTrack = UserTrack(TYPE_CONTENT)
userTracks = mutableListOf()
REF_DATABASE_ROOT.child(NODE_TRACKS).child(UID)
.addListenerForSingleValueEvent(AppValueEventListener {
it.children.forEach { trackID ->
executor.execute {
userTrack = UserTrack(TYPE_CONTENT)
Log.d("dbThread", Thread.currentThread().name)
userTrack.distance =
trackID.child(CHILD_DISTANCE).getValue(Double::class.java)!!
userTrack.time = LocationConverter.convertMStoTime(
trackID.child(CHILD_TIME).getValue(Long::class.java)!!
)
userTrack.startTime =
timeToDate(
trackID.child(CHILD_START_TIME).getValue(Long::class.java)!!
)
}
REF_DATABASE_ROOT.child(NODE_TRACKS).child(UID)
.child(trackID.key.toString()).child(
CHILD_TRACK_POINTS
).addListenerForSingleValueEvent(AppValueEventListener { tracks ->
tracks.children.forEach { points ->
executor.execute {
Log.d("dbThread", Thread.currentThread().name)
var pointsList = mutableListOf<Point>()
points.children.forEach { point ->
pointsList.add(
Point(
point.child(CHILD_LATITUDE)
.getValue(Double::class.java) as Double,
point.child(CHILD_LONGITUDE)
.getValue(Double::class.java) as Double
)
)
}
userTrack.trackPoints = pointsList
}
}
userTracks.add(userTrack)
}
)
}
})
}
fun initUserTracks(){
executor=Executors.newSingleThreadExecutor()
var userTrack=userTrack(类型\内容)
userTracks=mutableListOf()
REF\u DATABASE\u ROOT.child(节点跟踪).child(UID)
.addListenerForSingleValueEvent(AppValueEventListener{
it.children.forEach{trackID->
执行人{
userTrack=userTrack(类型\内容)
Log.d(“dbThread”,Thread.currentThread().name)
用户跟踪距离=
child(child_DISTANCE).getValue(Double::class.java)!!
userTrack.time=LocationConverter.convertMStoTime(
child(child_TIME).getValue(Long::class.java)!!
)
userTrack.startTime=
时差(
child(child\u START\u TIME).getValue(Long::class.java)!!
)
}
REF\u DATABASE\u ROOT.child(节点跟踪).child(UID)
.child(trackID.key.toString()).child(
子轨迹点
).addListenerForSingleValueEvent(AppValueEventListener{tracks->
tracks.children.forEach{points->
执行人{
Log.d(“dbThread”,Thread.currentThread().name)
var pointsList=mutableListOf()
points.children.forEach{point->
pointsList.add(
点(
点.子(子纬度)
.getValue(Double::class.java)作为Double,
点.子(子经度)
.getValue(Double::class.java)作为Double
)
)
}
userTrack.trackPoints=points列表
}
}
添加(userTrack)
}
)
}
})
}