Size: a a a

Kotlin Community

2020 June 30

А

Андрей in Kotlin Community
Eugene P.
А то, что он бессмысленный, это тоже как-то не правильно. Что, если приложение не будет знать, что это StateFlow, а будет думать, что это обычный Flow
StateFlow ~=  LiveData
Работай с ней так же.
источник

EP

Eugene P. in Kotlin Community
@mentarey Но API ломается, ведь StateFlow расширяет Flow
источник

А

Андрей in Kotlin Community
Eugene P.
@mentarey Но API ломается, ведь StateFlow расширяет Flow
Эти 2 флоу нужны для разных вещей, а ты не почитав ни про то, ни про другое, пытаешься что-то сделать.

Документации и статей горы, а кому-то лень разобраться, надо же сразу в чатик)
источник

EP

Eugene P. in Kotlin Community
@mentarey ок, спасибо. Пошел читать еще другую гору статей и документаций
источник

BP

Bogdan Panchenko in Kotlin Community
Кирилл Романенко
Почему? А если мне нужно сменить контекст вычислений?
Потому что value не саспенд, следовательно оно не может менять контекс, странно согласен
источник

BP

Bogdan Panchenko in Kotlin Community
Eugene у тебя StateFlow ведь, то есть из вне никто не меняет ? Там был пример как ним пользоваться: делаешь мутабельный приватным, запускаешь нужную корунтину в нужном диспетчере, обновляет свой мутабельный флоу, апи вышлядет так val state: StateFlow get() = privateMutableState
источник

EP

Eugene P. in Kotlin Community
Bogdan Panchenko
Eugene у тебя StateFlow ведь, то есть из вне никто не меняет ? Там был пример как ним пользоваться: делаешь мутабельный приватным, запускаешь нужную корунтину в нужном диспетчере, обновляет свой мутабельный флоу, апи вышлядет так val state: StateFlow get() = privateMutableState
Спасибо, я хотел узнать, как правильно менять контекст вычислений, уже имея StateFlow, но уже, похоже, не хочу :)
источник

BP

Bogdan Panchenko in Kotlin Community
Eugene P.
Спасибо, я хотел узнать, как правильно менять контекст вычислений, уже имея StateFlow, но уже, похоже, не хочу :)
Ну он должен работать как Observable value
источник

EP

Eugene P. in Kotlin Community
@SchFuntik я просто пришел из мира RxJava, где Hot и Cold observables позволяют менять контекст вычислений ниже по потоку. А тут начал изучать StateFlow и вижу, flowOn deprecated. Вот и хотел узнать а что если вдруг надо поменять контекст ниже по потоку, как это верно сделать
источник

EP

Eugene P. in Kotlin Community
Хм, похоже после map возвращается уже обычный flow, надо будет потестировать
источник

BP

Bogdan Panchenko in Kotlin Community
Eugene P.
@SchFuntik я просто пришел из мира RxJava, где Hot и Cold observables позволяют менять контекст вычислений ниже по потоку. А тут начал изучать StateFlow и вижу, flowOn deprecated. Вот и хотел узнать а что если вдруг надо поменять контекст ниже по потоку, как это верно сделать
Ну это ещё эксперементальная штука можно вносить предложения
источник

А

Андрей in Kotlin Community
Eugene P.
@SchFuntik я просто пришел из мира RxJava, где Hot и Cold observables позволяют менять контекст вычислений ниже по потоку. А тут начал изучать StateFlow и вижу, flowOn deprecated. Вот и хотел узнать а что если вдруг надо поменять контекст ниже по потоку, как это верно сделать
Просто StateFlow нужен только для того, чтобы в него засетить данные из любого места, даже из subscribe rxjava, а потом данные эти получать во View, чтобы получать их до и после изменения конфигурации.

FlowOn там и не нужен,  т.к. ты просто set/get выполняешь.
источник

EP

Eugene P. in Kotlin Community
@mentarey мне казалось, что это полноценная замена BehaviorProcessor
источник

А

Андрей in Kotlin Community
Eugene P.
@mentarey мне казалось, что это полноценная замена BehaviorProcessor
Это просто мидифицированная LiveData, основанная на корутинами, котлине.

Если тебе нужно менять поток исполнения, то он меняется в обычном flow через flowOn.
источник

EP

Eugene P. in Kotlin Community
@mentarey Похоже, что вы не правы и flowOn работает вниз по потоку
источник

EP

Eugene P. in Kotlin Community
@Test
   fun testStateFlow() {
       runBlocking {
           launch(GlobalScope.coroutineContext) {
               val state = MutableStateFlow<Int>(1)
               state
                       .onEach { log("First ${Thread.currentThread().name}") }
                       .flowOn(newSingleThreadContext("Thread1"))
                       .onEach { log("Second ${Thread.currentThread().name}") }
                       .flowOn(newSingleThreadContext("Thread2"))
                       .onEach { log("Third ${Thread.currentThread().name}") }
                       .launchIn(GlobalScope)
               log("Emit ${Thread.currentThread().name}")
               state.value = 1
               delay(100)
           }
       }
   }

   fun log(s: String) {
       System.out.println(s)
   }

Выводит
Emit main @coroutine#2
First Thread1 @coroutine#5
Second Thread2 @coroutine#4
Third DefaultDispatcher-worker-2 @coroutine#3

Т.е. flowOn не работает только непосредственно для StateFlow, после трансформаций уже работает
источник

А

Андрей in Kotlin Community
Eugene P.
@mentarey Похоже, что вы не правы и flowOn работает вниз по потоку
Он работает не так, как observeOn в RxJava.
Он меняет диспатчер для операторов сверху него.

А subscribeOn заменяет диспатчер из scope.launch.
источник

А

Андрей in Kotlin Community
Eugene P.
@Test
   fun testStateFlow() {
       runBlocking {
           launch(GlobalScope.coroutineContext) {
               val state = MutableStateFlow<Int>(1)
               state
                       .onEach { log("First ${Thread.currentThread().name}") }
                       .flowOn(newSingleThreadContext("Thread1"))
                       .onEach { log("Second ${Thread.currentThread().name}") }
                       .flowOn(newSingleThreadContext("Thread2"))
                       .onEach { log("Third ${Thread.currentThread().name}") }
                       .launchIn(GlobalScope)
               log("Emit ${Thread.currentThread().name}")
               state.value = 1
               delay(100)
           }
       }
   }

   fun log(s: String) {
       System.out.println(s)
   }

Выводит
Emit main @coroutine#2
First Thread1 @coroutine#5
Second Thread2 @coroutine#4
Third DefaultDispatcher-worker-2 @coroutine#3

Т.е. flowOn не работает только непосредственно для StateFlow, после трансформаций уже работает
Почитай статьи Рамона Елизарова, там все понятно и ясно.

А твой код ничего с реальным кодом не имеет...
источник

EP

Eugene P. in Kotlin Community
@mentarey спасибо за ваши ответы. Я думал, что flowOn вообще бессмыслен, если в цепочке есть StateFlow. Оказалось, что я заблуждался
источник

EP

Eugene P. in Kotlin Community
Андрей
Почитай статьи Рамона Елизарова, там все понятно и ясно.

А твой код ничего с реальным кодом не имеет...
Спасибо, что не упускаете возможности плюнуть в мою сторону
источник