Сопрограммы — получать новые данные только по одному, а затем прекращать подписку на потокAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Сопрограммы — получать новые данные только по одному, а затем прекращать подписку на поток

Сообщение Anonymous »

В моем проекте Android я хотел бы получать новые данные только один раз, после подписки на поток, а затем прекратить подписку. Я кое-что знаю о горячих потоках (SharedFlow).
Мои цели:
  • попробовать отправить данные (без приостановки )
  • подписаться на производителя
  • получить новые данные, а не исторические, только один раз
    < li>прекратить подписку
Мой упрощенный код:

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

    class Producer {
private val _event = MutableSharedFlow(
extraBufferCapacity = 1,
onBufferOverflow = BufferOverflow.DROP_OLDEST
)
val event: Flow = _event.asSharedFlow()

fun produce(event: String) {
_event.tryEmit(event)
}
}

class Consumer {
val producer = Producer()
var job: Job? = null

fun consume(viewModelScope: CoroutineScope) {
job = producer
.event
.onEach {
job?.cancel()
// process
}
.launchIn(viewModelScope)
}
}

Это работает, но, по моему мнению, некоторые функции можно заменить другими, например:
  • если я хочу получить только один раз данные, поэтому это должна быть другая функция вместо onEach
  • вместо хранения ссылки на Job и вызова launchIn. Я пытался вызвать .shareIn (viewModelScope, WhileSubscribed())

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

    .onEach {
// job?.cancel() 

Подробнее здесь: [url]https://stackoverflow.com/questions/78658783/coroutines-receive-new-data-only-ones-and-then-stop-subscribing-a-flow[/url]
Ответить

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

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

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

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

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