Я новичок в Kotlin / Coroutines, так что, надеюсь, я просто что-то упустил / не до конца понимаю, как структурировать свой код для проблемы, которую я пытаюсь решить.
По сути, я беру список строк, и для каждого элемента в списке я хочу отправить его другому методу для выполнения работы (выполнить сетевой вызов и вернуть данные на основе ответа).( Редактировать :) Я хочу, чтобы все вызовы запускались одновременно, и блокировались до тех пор, пока не будут выполнены все вызовы / ответ не обработан, а затем возвращаю новый список с информацией о каждом ответе.
Я, вероятно, еще не до конца понимаю, когда использовать launch / async, но я пытался следовать как при запуске (с joinAll
), так и при асинхронности (с await
).
fun processData(lstInputs: List<String>): List<response> {
val lstOfReturnData = mutableListOf<response>()
runBlocking {
withContext(Dispatchers.IO) {
val jobs = List(lstInputs.size) {
launch {
lstOfReturnData.add(networkCallToGetData(lstInputs[it]))
}
}
jobs.joinAll()
}
}
return lstofReturnData
То, что я ожидаю, произойдет, если мой lstInputs
будет иметь размер 120, когда все рабочие места будут объединены, мой lstOfReturnData
также должен иметь размер 120.
То, что происходит на самом деле, является неуместнымРезультаты.Я запускаю его один раз, и я получаю 118 в моем окончательном списке, запускаю его снова, это 120, запускаю его снова, это 117 и т. Д. В методе networkCallToGetData()
я обрабатываю любые исключения, чтобы хотя бы вернуть что-тодля каждого запроса независимо от того, произошел ли сбой сетевого вызова.
Может ли кто-нибудь помочь объяснить, почему я получаю противоречивые результаты, и что мне нужно сделать, чтобы обеспечить надлежащую блокировку и объединение всех заданий, прежде чем двигаться дальше?