Запрос на опрос по каналам сопрограмм - PullRequest
0 голосов
/ 24 апреля 2020

Мне нужно делать опрос в 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()
    }
}
...