Почему мой код не выполняется сверху вниз в kotlin? - PullRequest
0 голосов
/ 07 октября 2019

Я делаю обзор переработчика. при использовании init block возникла проблема. Я ожидал, что код выполняется по порядку. но он вышел из строя

Какой-то код:

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

, почемуthis?

В качестве дополнительной проблемы, из-за вышеуказанного порядка, последний doListDTOs.toString () является нулевым в журнале 3. но doListDTOs.toString в журнале 2 имеет некоторое значение. Если это не проблема заказа, я был бы признателен, если бы вы сказали мне, в чем проблема.

1 Ответ

1 голос
/ 07 октября 2019

Когда вы подключаетесь к Firestore и пытаетесь запросить данные из базы данных Firestore. Вы делаете сетевой вызов, который выполняется через фоновый поток. Теперь основной поток сначала печатает для вас журнал как 1., а затем начинает новый поток A (например). И, наконец, выведите 3. Но вы должны заметить, что 2 будет напечатано, когда данные будут считаны через поток A и возвращены в обратный вызов основного потока (IPC), и именно поэтому он показывает 3 перед 2.

Есливам нужно запустить 3 после 2, у вас есть код записи в обратном вызове firestore. когда это задание будет выполнено, вы начнете свой следующий шаг.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...