Size: a a a

ReactiveX - русскоговорящее сообщество

2021 April 03

l

lenar in ReactiveX - русскоговорящее сообщество
не, сразу не будет. будет либо если без элементов (только oncomplete), либо более одного элемента. то есть должен быть onnext+oncomplete
источник

l

lenar in ReactiveX - русскоговорящее сообщество
значения нет это oncomplete и ни одного onnext
источник

l

lenar in ReactiveX - русскоговорящее сообщество
может тебе maybe нужен, а не single?
источник

QH

Quantum Harmonizer in ReactiveX - русскоговорящее сообщество
нет, если нет значения, его нужно дождаться
источник

AI

Alexey Illarionov in ReactiveX - русскоговорящее сообщество
oncomplete в BehaviorSubject не придет, если его никто не заэммитит (а обычно его никто не эммитит), single() должен дожидаться первого onNext
источник
2021 April 05

WA

Wolfgang Amadeus in ReactiveX - русскоговорящее сообщество
Привет. В смысле реактивное программирование? Тут по java можно задавать вопросы?)
источник

QH

Quantum Harmonizer in ReactiveX - русскоговорящее сообщество
источник

GP

Grzegorz `gzhegow` P... in ReactiveX - русскоговорящее сообщество
Вчера наблюдал странность, хотел сделать стрим, в который с помощью мержа воткнул сверху сабжект без состояния, чтоб стрим "переделывался" из обычной переменной когда я ткну сабжект. В верстке подписался потом. Так эта зараза почему то не отдавала данных никуда, сабжект тупо игнорировался. Стоило мержем к сабжекту присобачить второй источник в моем случае роутер, внезапно заработал и первый. Есть идеи что могло быть не так???

Была мысль что он подписывается в верстке позже чем я отсылаю в сабжект пинок, добавлял таймауты и ничего, потом сделал оператор share() чтоб все подписчики ловили то же значение, потом даже shareReplay() написал, чтобы держать копию и все равно ничего. Стоило в верхний мерж добавить второй источник сразу везде заработало, что не так с обычным сабжектом???
источник
2021 April 07

GP

Grzegorz `gzhegow` P... in ReactiveX - русскоговорящее сообщество
Ясно понятно.
источник
2021 April 08

I

Ivan in ReactiveX - русскоговорящее сообщество
Всем привет.

Вот типичаня ситуация, во ViewModel вы подписываетесь на Observable из БД и периодически получаете какой-то объект, допустим, UserSettings, и кладёте его в глобальную переменную, к которой вы много раз обращаетесь в коде, например, делая проверки, типо if userSettings.что-то == чему-то, когда юзер нажимает кнопку и тд.

Мой вопрос про потоки. Есть ли смысл класть UserSettings в глобальную переменную исключательно в основном потоке? (с учётом того, что все вышеописанные проверки делаются в основном потоке)

Или это не имеет большого смысла, типо тут от race condition не уйдёшь, или есть какой-то другой подход, или я, вообще, что-то упускаю?

var userSettings = UserSettings.default()

repository.getUserSettings()
 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
 .doOnNext { userSettings = it }

или

.observeOn(AndroidSchedulers.mainThread())

можно убрать?
источник

AI

Alexey Illarionov in ReactiveX - русскоговорящее сообщество
если к глобальной переменной обращаешься только из основного потока, то можно observeOn, иначе - synchronized
источник

I

Ivan in ReactiveX - русскоговорящее сообщество
Спасибо. А synchronized же только на метод, на переменную же valotile, по идее
источник

AS

Artem Shaydukov in ReactiveX - русскоговорящее сообщество
Нет. Volatile - это про visibility, synchronized - это про атомарность.
источник

I

Ivan in ReactiveX - русскоговорящее сообщество
ага, сейчас читаю про это как раз.

Касательно volatile, как я всё-таки понял: если есть гарантия, что только один поток изменяет переменную (Schedulers.single()), то мэйну будут видны изменения, и можно обойтись только volatile, а вот если потоков уже несколько (Schedulers.io()), то нужен synchronized set.
источник

I

Ivan in ReactiveX - русскоговорящее сообщество
When is volatile Enough?
As I have mentioned earlier, if two threads are both reading and writing to a shared variable, then using the volatile keyword for that is not enough. You need to use a synchronized in that case to guarantee that the reading and writing of the variable is atomic. Reading or writing a volatile variable does not block threads reading or writing. For this to happen you must use the synchronized keyword around critical sections.

As an alternative to a synchronized block you could also use one of the many atomic data types found in the java.util.concurrent package. For instance, the AtomicLong or AtomicReference or one of the others.
источник
2021 April 12

DH

Daniil Horishnii in ReactiveX - русскоговорящее сообщество
Есть PublishSubject, как лучше всего реализовать емит туда 1 айтема с некоторой задержкой и c возможностью  отменить этот эмит (если задержка еще не прошла) ?
источник

DH

Daniil Horishnii in ReactiveX - русскоговорящее сообщество
observable.timer где в сабскрайбе просто эмит на сабджект + dispose в случае отмены - первое что приходит в голову, но мб есть красивее вариант
источник

l

lenar in ReactiveX - русскоговорящее сообщество
cancelObs.timer(1).flatmap(v -> empty).onErrorResumeNext(thr -> singleValueObs))
источник
2021 April 13

A

Aleksandr in ReactiveX - русскоговорящее сообщество
Только не забывайте, что у вас какой-то конкретный объект (UserSettings). В данном случае volatile не поможет полноценно избежать проблем (кэширование происходит в одно место, семантика happens before соблюдается, но атомарности нету). Явно будут случаи, когда констстентность будет отсутствовать, что приводит к потенциальным гонкам.  А atomic reference не пробовали кстати?
источник

I

Ivan in ReactiveX - русскоговорящее сообщество
Спасибо. Про AtomicReference читал в статьях, которые выше кидал. Он должен решать проблему
источник