ок, разобрался с решением для опроса с использованием каналов. это должно помочь кому-то в поиске примера.
private val pollingChannel = Channel<Deferred<Result<OrderStatus>>>()
val POLLING_TIMEOUT_DURATION = 10000L
val POLLING_FREQUENCY = 2000L
Для удержания вашего асинхронного запроса необходим канал на тот случай, если во время выполнения асинхронной задачи c поступит дополнительный запрос.
val pollingChannel = Channel<Deferred<Pair<Int,Int>>>()
QUEUE EXECUTOR : он выберет асиную задачу c и начнет выполнять ее в порядке FIFO.
CoroutineScope(Dispatchers.IO).launch {
for (i in pollingChannel) {
val x = i.await()
println("${SimpleDateFormat("mm:ss.SSS").format(Calendar.getInstance().time)} Request ${x.first}: value ${x.second}")
}
}
ФУНКЦИЯ ОПРОСА : добавляет асиную задачу c в канал опроса каждый фиксированный интервал времени до истечения времени ожидания.
CoroutineScope(Dispatchers.IO).launch {
var reqIndex = 1
val timedOut = withTimeoutOrNull(POLLING_TIMEOUT_DURATION) {
while (receiverJob.isActive) {
pollingChannel.send(async {
getRandomNumber(reqIndex++)
})
delay(POLLING_FREQUENCY)
}
}
}
АСИНХРОННАЯ ЭКСПЛУАТАЦИЯ
во избежание многословности ответа Я создал функцию со случайной задержкой, замените ее на требуемый вызов API
private suspend fun getRandomNumber(index: Int): Pair<Int,Int> {
val randomDuration = (1..6L).random() * 500
delay(randomDuration)
return Pair(index,(0..100).random())
}
SAMPLE OUTPUT