Android 如何等待Firebase DB完成加载?

Android 如何等待Firebase DB完成加载?,android,firebase,kotlin,firebase-realtime-database,Android,Firebase,Kotlin,Firebase Realtime Database,我在预加载数据库时遇到了一个问题,从中创建了一个列表,然后应该显示在一个片段中。如果我运行函数并等待几秒钟,那么一切都正常(例如,在mineActivity启动时启动函数,然后调用显示列表的片段)。但是我想在每次调用带有此列表的片段时运行该函数,但我不知道如何跟踪列表的填充以及从数据库接收信息的完成情况。因此,列表显示为空 fun initUserTracks() { executor = Executors.newSingleThreadExecutor() var userT

我在预加载数据库时遇到了一个问题,从中创建了一个列表,然后应该显示在一个片段中。如果我运行函数并等待几秒钟,那么一切都正常(例如,在mineActivity启动时启动函数,然后调用显示列表的片段)。但是我想在每次调用带有此列表的片段时运行该函数,但我不知道如何跟踪列表的填充以及从数据库接收信息的完成情况。因此,列表显示为空

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