Как дождаться завершения запроса базы данных сопрограммы Dispatch.IO для заполнения RecyclerView - PullRequest
1 голос
/ 02 декабря 2019

Я переписываю свое приложение для заметок на Java в Kotlin. Я пытаюсь заполнить RecyclerView текстовыми представлениями, созданными на основе моего запроса к базе данных SQLite, но я не могу понять, как заставить его ждать выполнения запроса или выполнить какое-либо действие после его выполнения.

В моей версии Java я выполнил это, используя AsyncTask для запроса и затем вызвав PostExecute.

Сейчас в моей версии Kotlin я использую запуск (Dispatchers.IO), но яне уверен, как сделать все остальное. Как выполнить ту же функциональность?

1 Ответ

1 голос
/ 02 декабря 2019

В сопрограммах вы можете создать очередь из неидентичных кодов сопрограмм. Например, один блок из coroutine1, а другой - из coroutine2 и заставить их работать последовательно. Можно использовать withContext(CoroutineContext)

. Примите этот код:

fun uiCode() {
  // doing things specially on mainThread
}

fun uiCode2() {
  // More work on mainThread
}

fun ioCode() {
  // Doing something not related to mainThread.
}

fun main() {

  launch(Dispatchers.Main) { // 1- run a coroutine
     uiCode() // will run on MainThread
     withContext(Dispachers.IO) { // 2- Coroutine will wait for ioCode
         ioCode() // Will run on ioThread
     }
     uiCode2() // 3- And then it will run this part
  }
}

Если вы хотите сделать это асинхронно, используйте launch() вместо withContext().

...