我正在查看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具有某些值。 如果这不是订单问题,请告诉我问题出在哪里,我将不胜感激。
答案 0 :(得分:1)
当您连接到Firestore并尝试从Firestore DB请求数据时。您正在通过网络后台线程进行网络调用。 现在主线程首先为您打印日志1.然后启动新线程A(例如)。最后打印3。 但是您必须注意,当通过线程A读取数据并返回到主线程(IPC)的回调时,将打印2。这就是为什么它在2之前显示3的原因。
如果您需要两次运行3,则可以在firestore回调中编写代码。该任务完成后,您将开始下一步。
希望有帮助!