Я новичок в сопрограммах, но думаю, что могу ответить за них:
Вы можете использовать сопрограммы runBlocking {} для этого.
private fun assignAllAnswersToQuestion(questionId: Long) = launch {
runBlocking {
answerListCreated.forEach { assignAnswerToQuestion(questionId, it.id) }
}
anotherCallHere(questionId)
}
private fun assignAnswerToQuestion(questionId: Long, answerId: Long) = launch (Dispatchers.IO) {
questionService.addAnswerToQuestion(
questionId,
answerId,
MyUtils.getAccessTokenFromLocalStorage(context = this)
)
}
launch {} возвращает объект Jobкоторая становится дочерней работой родительского сопрограммы.runBlocking {} будет блокировать до тех пор, пока все его дочерние задания не будут завершены (альтернатива - использовать запуск {} .join (), который будет иметь одинаковый эффект).
Обратите внимание, что обе функции обернули свой кодв блоке запуска {}.Чтобы иметь возможность вызывать метод запуска {}, вы, вероятно, захотите, чтобы ваш класс реализовал CoroutineScope
class MyActivityOrFragment: Activity(), CoroutineScope {
lateinit var job = SupervisorJob()
private val exceptionHandler =
CoroutineExceptionHandler { _, error ->
toast(error.message.toString()
}
override val coroutineContext = Dispatchers.Main + job + exceptionHandler
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job()
}
override fun onDestroy() {
super.onDestroy()
job.cancel()
}
...
}