Не заходит в viewModelScope
только начинаю свой путь в Kotlin. Прошу дать подсказку куда копать. Есть ViewModel класс с таким методом
private fun sendAnswers() {
Log.d(TAG, "TaskExecutionViewModel: Sending answers")
try {
for (item in capturedImages) {
Log.d(
TAG,
"TaskExecutionViewModel: Sending answers (${capturedImages.count()}), idSmenZad: ${item.taskId}, idAction: ${item.actionId}, images: ${item.images.count()}"
)
viewModelScope.launch {
Log.d(TAG, "TaskExecutionViewModel: In viewModelScope")
val res = withContext(Dispatchers.IO) {
sendAnswersUseCase(item.taskId, item.actionId, item.images.toList(), item.timeStart)
}
if (res.isSuccess) {
Log.d(
TAG,
"TaskExecutionViewModel: Answers sent successfully, preparing next answer"
)
} else {
Log.d(
TAG,
"TaskExecutionViewModel: Answers sent failure, preparing next answer"
)
}
}
}
capturedImages.clear()
_state.value = TaskExecutionState.Completed
} catch (e: Exception) {
Log.e(TAG, "TaskExecutionViewModel: Failed to send answers: ${e.message}", e)
_state.value = TaskExecutionState.Error("Failed to send answers: ${e.message}")
}
}
Лог получается следующий
D TaskExecutionViewModel: Sending answers
D TaskExecutionViewModel: Sending answers (2), idSmenZad: 7, idAction: 4, images: 1
D TaskExecutionViewModel: Sending answers (2), idSmenZad: 8, idAction: 4, images: 1
Код внутри viewModelScope.launch не выполняется, что не так?
Если нужно что-то еще предоставить - пишите
Ответы (1 шт):
вы берете список, начинаете проходить по его элемент и на каждый элемент запускаете корутину. затем, недожидаясь завершения работы корутин, вы очищаете этот список.
вам стоит преобразовать ваш код к следующему виду:
fun myFun(){
viewModelScope.launch{
list.map{
launch{
// асинхронное выполнение для каждого объекта
}
}.joinAll()
list.clear()
}
}
таким образом, вы сможете запустить на каждый элемент отдельную корутину, дождаться завершения их работы и только затем очистить список.
p.s. код писал в блокноте, поэтому могут быть неточности.
p.p.s. чтобы запустить билддер .launch
внутри корутины, скорее всего надо будет ее запустить внутри блока withContext()
.