为什么';我的代码不是在kotlin中自上而下执行的吗?

为什么';我的代码不是在kotlin中自上而下执行的吗?,kotlin,Kotlin,我正在做一个回收视图。当使用init块时,我遇到了问题。 我希望代码按顺序执行。但是它坏了 一些代码: inner class TodoListFragmentRecyclerViewAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() { val doListDTOs = ArrayList<DoListDTO>() init { Log.e("1"

我正在做一个回收视图。当使用init块时,我遇到了问题。 我希望代码按顺序执行。但是它坏了

一些代码:

inner class TodoListFragmentRecyclerViewAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
        val doListDTOs =  ArrayList<DoListDTO>()

        init {
            Log.e("1","1")
            doListListenerRegistration = fireStore.collection("doList").whereEqualTo("doListName",todoList_name).orderBy("doListTimestamp", Query.Direction.DESCENDING).limit(100)
                .addSnapshotListener { querySnapshot, firebaseFirestoreException ->
                    if (querySnapshot == null) return@addSnapshotListener
                    doListDTOs.clear()
                    for (snapshot in querySnapshot.documents) {
                        val item = snapshot.toObject(DoListDTO::class.java)
                        doListDTOs.add(item!!)
                        Log.e("2",doListDTOs.toString())
                        notifyDataSetChanged()
                    }
                }
            Log.e("3",doListDTOs.toString())
        }
}
内部类ToDoListFragmentRecycleServiceAdapter:RecyclerView.Adapter(){
val doListDTOs=ArrayList()
初始化{
日志e(“1”、“1”)
doListListenerRegistration=fireStore.collection(“doList”).whereEqualTo(“doListName”,todoList\u name).orderBy(“doListTimestamp”,Query.Direction.DESCENDING).限制(100)
.addSnapshotListener{querySnapshot,firebaseFirestoreException->
if(querySnapshot==null)return@addSnapshotListener
doListDTOs.clear()
for(querySnapshot.documents中的快照){
val item=snapshot.toObject(DoListDTO::class.java)
添加(项目!!)
Log.e(“2”,doListDTOs.toString())
notifyDataSetChanged()
}
}
Log.e(“3”,doListDTOs.toString())
}
}
我希望日志显示如下顺序
1->2->3
但是,实际输出是
1->3->2

为什么会这样

另外一个问题是,由于上面的顺序,最后一个doListDTOs.toString()在日志3中为null。但是日志2中的doListDTOs.toString有一些价值。
如果这不是订单问题,如果您能告诉我问题出在哪里,我将不胜感激。

当您连接到Firestore并尝试从Firestore DB请求数据时。您实际上正在进行一个通过后台线程运行的网络呼叫。 现在,主线程首先将日志打印为1。然后启动一个新线程a(例如)。最后打印3。 但您必须注意,当数据通过线程A读取并返回到主线程(IPC)的回调时,2将被打印,这就是为什么它在2之前显示3的原因

如果需要在两次之后运行3,则必须在firestore回调中编写代码。当该任务完成时,您将完成下一步


希望有帮助

谢谢大家!!我通过以下方式解决了这个问题:“Task combinedTask=Tasks.whenAllSuccess(firstTask,secondTask).addOnSuccessListener(new OnSuccessListener(){@Override public void onSuccess(List){//这是我想要的列表}}”);“请查看下面的链接祝您度过愉快的一天!