Size: a a a

Kotlin Community

2020 July 14

BP

Bogdan Panchenko in Kotlin Community
Кирилл Романенко
Подскажите, пожалуйста, как лучше обойти проблему.
Здесь отчасти замешан андроид, но вопрос именно про флоу.

inline fun <T> Flow<T>.collectLifecycle(lifecycleOwner: LifecycleOwner, crossinline block: (T) -> Unit) {
   lifecycleOwner.lifecycleScope.launchWhenStarted {
       collect { block.invoke(it) }
   }
}

Коллектинг флоу суспендится, если будет onStop, и когда пользователь вернётся - коллектинг зарезьюмится. Проблема в том, что если в этом промежутке было много новых ивентов, то они вывалятся пачкой, а мне надо взять только последнее. Добавление conflate() не помогает, помогло debounce(10), но это не подходящее решение, надо без дебаунса. Есть идеи?
есть метод onCompletion он вызывается как раз когда отменяешь, можно покопать в эту сторону
источник

V

Vladimir in Kotlin Community
Eugene P.
Какой каноничный способ организовать очередь для доступа/редактирования данных в многопоточной среде чтобы исключить параллельный доступ к данным? Один из вариантов это использовать Mutex для блокировки, Но в документации нашел пример на акторах. Есть ли способ шарить актор между разными методами? Пример, как тут правильно реализовать функцию sendMessage
Способ шарить актор между разными методами есть, Ваш код будет выглядеть примерно так:

 private val sendMessageActor = GlobalScope.actor<UserMsg> {
       for(msg in channel){
           when (msg) {
               is UserMsg.SetUser -> user = msg.user
               is UserMsg.GetUser -> msg.response.complete(user)
           }
       }
 }

 suspend fun setUser(user: User) {
     sendMessageActor.send(UserMsg.SetUser(user))
 }

только замените GlobalScope на нужный вам скоуп, ознакомьтесь подробнее с докой по акторам и выберите наиболее подходящий для вашего кейса capacity
источник

EP

Eugene P. in Kotlin Community
Vladimir
Способ шарить актор между разными методами есть, Ваш код будет выглядеть примерно так:

 private val sendMessageActor = GlobalScope.actor<UserMsg> {
       for(msg in channel){
           when (msg) {
               is UserMsg.SetUser -> user = msg.user
               is UserMsg.GetUser -> msg.response.complete(user)
           }
       }
 }

 suspend fun setUser(user: User) {
     sendMessageActor.send(UserMsg.SetUser(user))
 }

только замените GlobalScope на нужный вам скоуп, ознакомьтесь подробнее с докой по акторам и выберите наиболее подходящий для вашего кейса capacity
Спасибо. Буду читать, пробовать
источник

V

Vladimir in Kotlin Community
надеюсь Ваш Dao класс не для рума написан, потому что там под капотом уже настроен синхронизированный доступ к БД
источник

EP

Eugene P. in Kotlin Community
Vladimir
надеюсь Ваш Dao класс не для рума написан, потому что там под капотом уже настроен синхронизированный доступ к БД
Это просто пример. Мне было интересно, как можно организовать такие очереди без мутексов и какой способ правильный
источник

EP

Eugene P. in Kotlin Community
Акторы ещё не собираются депрекейтить?
источник

AN

Alexander Nozik in Kotlin Community
Eugene P.
Акторы ещё не собираются депрекейтить?
Их будут не депрекейтить, а апгрейдить
источник

EP

Eugene P. in Kotlin Community
Alexander Nozik
Их будут не депрекейтить, а апгрейдить
Спасибо.
источник

AM

Andrew Mikhaylov in Kotlin Community
Livestream "Библиотеки Kotlinx.*" стартует через 10 минут! Приготовьте горячий напиток, уютное место и свои вопросы ведь гость выпуска - Всеволод Толстопятов из JetBrains!

Что сегодня в программе обсуждения:
👉 Coroutines
👉 Flow & Channel
👉 Kotlin 1.4
👉 Kotlin Serialization
👉 Будущие библиотеки KotlinX: DateTime, I/O и др.
👉 Kotlin Collections
источник

BP

Bogdan Panchenko in Kotlin Community
Andrew Mikhaylov
Livestream "Библиотеки Kotlinx.*" стартует через 10 минут! Приготовьте горячий напиток, уютное место и свои вопросы ведь гость выпуска - Всеволод Толстопятов из JetBrains!

Что сегодня в программе обсуждения:
👉 Coroutines
👉 Flow & Channel
👉 Kotlin 1.4
👉 Kotlin Serialization
👉 Будущие библиотеки KotlinX: DateTime, I/O и др.
👉 Kotlin Collections
давно началось ? а то ворвался уже на рассуждении
источник

AM

Andrew Mikhaylov in Kotlin Community
Bogdan Panchenko
давно началось ? а то ворвался уже на рассуждении
Предположительно 20 минут назад
источник

AM

Andrew Mikhaylov in Kotlin Community
Я, увы, не слушаю
источник

В

Владимир in Kotlin Community
Ребят, кто может подсказать. В Intellij idea community при создании Gradle (java+kotlin/jvm) проекта не создаётся папка src и все остальные лежащие в ней (main, test...) Кто может знает в чем проблема и как починить?
источник

BP

Bogdan Panchenko in Kotlin Community
Andrew Mikhaylov
Livestream "Библиотеки Kotlinx.*" стартует через 10 минут! Приготовьте горячий напиток, уютное место и свои вопросы ведь гость выпуска - Всеволод Толстопятов из JetBrains!

Что сегодня в программе обсуждения:
👉 Coroutines
👉 Flow & Channel
👉 Kotlin 1.4
👉 Kotlin Serialization
👉 Будущие библиотеки KotlinX: DateTime, I/O и др.
👉 Kotlin Collections
может не новости но модель памяти в нейтиве меняют, упрощают
источник

BP

Bogdan Panchenko in Kotlin Community
источник

AN

Alexander Nozik in Kotlin Community
Bogdan Panchenko
может не новости но модель памяти в нейтиве меняют, упрощают
Это я пропустил. Вроде говорили, что будет две модели памяти
источник

AN

Alexander Nozik in Kotlin Community
Ну это давно планировалось
источник

BP

Bogdan Panchenko in Kotlin Community
Alexander Nozik
Это я пропустил. Вроде говорили, что будет две модели памяти
ну это не офф ответ, но вроде речь как раз про одну, по крайне мере речь шла про многоточечные корутины
источник

AN

Alexander Nozik in Kotlin Community
Bogdan Panchenko
ну это не офф ответ, но вроде речь как раз про одну, по крайне мере речь шла про многоточечные корутины
А, ну так там да. Там релаксед модель.
источник

AN

Alexander Nozik in Kotlin Community
Просто на стрикт модели они не получаются нормально.
источник