Я получил решение от сопрограмм .
Сначала сделайте fetchItems
функцией приостановки:
suspend fun fetchItems(paramter: Parameter) {}
Затем
var startIndex = 0
var batchSize = 10
var totoalCount = 50
var requestTimes = totoalCount/batchSize
launch {
(1..requestTimes).asFlow()
.map {
val p = parameter.copy(startIndex = it * 10)
fetchItems(p, completion)
}.collect()
}
Достаточно просто.
Или вы можете использовать другую версию запуска:
launch {
repeat(parameter.requestTimes) {
val p = parameter.copy(startIndex = it * batchSize)
requestContact(p, completion)
}
}
PS : 1. Для параметра попробуйте использовать свойства val
для убедитесь, что это потокобезопасно.
Иногда вам может потребоваться отменить пакетные запросы.
Вот решение:
class Downloader: CoroutineScope by CoroutineScope(Dispatchers.Default) {
fun destroy() {
cancel()
}
fun startDownloder() {
// add above launch in here.
}
}
Тогда вы можете:
runBlocking {
val downloader = Downloader()
downloader.startDownloder()
delay(5000L) // this can be used just for debugging to see requests are really canceled
// Cancel the requests
downloader.destroy()
}