Как справиться с состоянием гонки с помощью Coroutines в Котлине?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как справиться с состоянием гонки с помощью Coroutines в Котлине?

Сообщение Anonymous »

У меня есть проблема с сопрограммой/потоком, которую я пытаюсь решить
У меня есть метод getClosesRegion, который должен делать следующее:
  • Попытка подключения к каждому региону
  • Первый регион для подключения (я использую запуск, чтобы попытаться подключиться) всем одновременно), должен быть возвращен, а остальные запросы региона должны быть отменено
  • Если во всех регионах не удалось подключиться ИЛИ после 30-секундного тайм-аута, выдать исключение
Это то, что у меня есть на данный момент:

Код: Выделить всё

override suspend fun getClosestRegion(): Region {
val regions = regionsRepository.getRegions()
val firstSuccessResult = MutableSharedFlow(replay = 1)
val scope = CoroutineScope(Dispatchers.IO)

// Attempts to connect to every region until the first success
scope.launch {
regions.forEach { region ->
launch {
val retrofitClient = buildRetrofitClient(region.backendUrl)
val regionAuthenticationAPI = retrofitClient.create(AuthenticationAPI::class.java)
val response = regionAuthenticationAPI.canConnect()
if (response.isSuccessful && scope.isActive) {
scope.cancel()
firstSuccessResult.emit(region)
}
}
}
}

val result = withTimeoutOrNull(TimeUnit.SECONDS.toMillis(30)) { firstSuccessResult.first() }
if (result != null)
return result
throw Exception("Failed to connect to any region")
}
Проблемы с текущим кодом:
  • Если 1 регион был успешно подключен, я ожидаю, что запросы будут отменено (с помощьюscope.cancel()), но на самом деле другие регионы, которые успешно подключились ПОСЛЕ первого, также передают значение в поток (

    Код: Выделить всё

    scope.isActive
    возвращает true)
    Я не знаю, как обрабатывать состояние гонки, вызывающее исключение, если во всех регионах не удалось подключиться или после 30-секундного тайм-аута
Кроме того, я новичок в Kotlin Flow и Coroutines, поэтому не знаю, действительно ли здесь необходимо создание потока

Подробнее здесь: https://stackoverflow.com/questions/724 ... -in-kotlin
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»