为什么我的代码没有在kotlin中自上而下执行?

时间:2019-10-07 05:51:10

标签: kotlin

我正在查看recyclerview。使用 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())
        }
}

我希望日志显示如下所示 1 -> 2 -> 3 但是,实际输出是 1 -> 3 -> 2

这是为什么?

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

1 个答案:

答案 0 :(得分:1)

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

如果您需要两次运行3,则可以在firestore回调中编写代码。该任务完成后,您将开始下一步。

希望有帮助!