Мне нужно делать опрос в API каждые 20 секунд. Когда я покидаю экран, опрос должен остановиться.
Моя проблема в том, что я пытался использовать каналы Coroutines, и он вызывает его только один раз. Я не уверен, как заставить его звонить несколько раз.
В классе RemoteDataSource у меня есть следующие логи c:
override suspend fun fetchInfo(id: String): Channel<Result<MyModel, ResultError>> {
val channel = Channel<Result<MyModel, ResultError>>()
GlobalScope.launch { sendId(channel, id, 20000) }
return channel
}
suspend fun sendId(channel: SendChannel<Result<MyModel, ResultError>>, id: String, time: Long) {
while (true) {
channel.send(
safeApiCall {
api.fetchInfo(id)
}.mapSuccess { infoResponse ->
mapper.mapFrom(infoResponse)
}
)
delay(time)
}
}
override suspend fun cancelFetchInfo() {
coroutineContext.cancelChildren()
}
В этом классе у меня есть еще один вызов API, который отлично работает:
override suspend fun createInfo(createInfo: CreateInfoModel): Result<MyModel, ResultError> =
safeApiCall {
api.createInfo(createInfo)
}.mapSuccess { infoResponse ->
mapper.mapFrom(infoResponse)
}
safeApiCall:
suspend fun <T> safeApiCall(
dispatcher: CoroutineDispatcher = Dispatchers.IO,
apiCall: suspend () -> T
): Result<T, ResultError.NetworkError> {
return withContext(dispatcher) {
try {
Result.Success(apiCall())
} catch (exception: Exception) {
...
}
}
}
Функция fetchInfo () вызывается, когда начинается действие, и cancelFetchInfo () должна вызываться, когда действие приостанавливается.
На мой взгляд, модель я делаю это
fun fetchInfo() {
viewModelScope.launch {
val channel = fetchInfo("1")
channel.receive()
}
}