Я сталкиваюсь с меньшей проблемой, когда речь заходит о сопрограммах Kotlin:
У меня есть список записей, которые все могут передать «задание», которое вызывается с помощью CoroutineContext.IO. Я заметил некоторые проблемы при прокрутке списка, когда эти записи запрашиваются, как только они становятся видимыми. Каждый Entrys вызывает «Запрашивающего», который вызывает переданный Запрос:
override fun <T : Any> enqueue(request: () -> Result<T>) {
job = CoroutineScope(provider.io()).launch {
(coroutineName)
try {
when (val result = request()) {
is Result.Success -> {
notifyAdapter(result)
}
is Result.Error -> {
notifyAdapter(result)
}
}
} catch (firewall: Exception) {
logger.e(tag, "Failed to Request Data", firewall)
}
}
}
Я заметил, что эти запросы вызывают «рывки» при рендеринге пользовательского интерфейса. Выше код будет выполняться где-то между 4-12 запросами, в зависимости от отображаемых Entrys.
Я прочитал, что IO CoroutineContext не связан и будет создавать потоки в фоновом режиме, когда это необходимо, поэтому не должно быть никаких проблем, поскольку все они находятся в другом потоке. После того, как запрос сделан, я передаю результат запроса вызывающей стороне в главном потоке:
private suspend fun notifyAdapter(result: Result<Any>) =
withContext(provider.main()) {
notifyResult.requestUpdate(id, result)
}
Я все еще пытаюсь лучше понять проблему "джанка", так есть ли какая-то отладочная информация, как / когда создаются потоки в IO CoroutineContext?
Спасибо за вашу помощь.