Темы RxJava нужны?

Я только начал изучать RxJava и думать реактивно. Я нашел статью (7 советов), в которой говорится, что предметы следует использовать только в крайнем случае или в качестве первой реализации, и я подумал. На данный момент у меня есть один PublishSubject

   PublishSubject.create()
    .scan(0, (a, b) -> a + 1).subscribe(replaySubject)

Он каждый раз увеличивает значение на 1 и подписывается replaySubject.

Воспроизвести Тему.создать();

Это просто печатает значение. Итак, в начале у меня есть 0, затем на каждые PublishSubject.onNext я увеличиваю значение, поэтому я получил 1, 2 и т. д. Поскольку это replaySubject, я получаю всю цепочку. Однако я подумал, можно ли это сделать без субъектов? Я читал RxJava Wiki и операторов, но не могу понять, как это можно сделать.

Обновлять

Таким образом, псевдокод, который я пытаюсь заархивировать, каким-то образом имеет одну наблюдаемую, начинающуюся с 1.

Observable.just(1)

Теперь у меня есть прослушиватель кликов

OnClick{ }

И каждый раз, когда я нажимаю на какую-либо кнопку, я хочу видеть все предыдущие числа + 1, поэтому 1, затем 1, 2, следующие 1,2,3 и т. д. Я пробовал с ConnectableObservator.replay, однако это вообще не удалось. И внутри слушателя я пытался сначала добавить сканирование в свой Observable, чтобы увеличить значение, а затем подписаться, чтобы я мог его распечатать. Но и это не работает. Черт, я думаю, что я в черном углу и неправильно понял идею наблюдаемых...


person user3274539    schedule 12.10.2014    source источник
comment
Вы хотите воспроизвести элементы PublishSubject?   -  person zsxwing    schedule 13.10.2014
comment
Я хочу исключить PublishSubject и ReplaySubject, так как я мог бы каким-то образом увеличить свое значение с 0 до x, скажем, при щелчке мышью.   -  person user3274539    schedule 13.10.2014
comment
Почему observable.scan(0, (a, b) -> a + 1) не работает?   -  person zsxwing    schedule 13.10.2014
comment
Это так, но допустим, у меня есть Observable.just(0) и событие нажатия кнопки, теперь у меня есть один подписчик, который подписывается на мой Observable и печатает его значение. Итак, он печатает 0. Теперь я при каждом нажатии кнопки хочу увеличить это значение и отправить его всем подписчикам, возможно, я еще не понял всей идеи.   -  person user3274539    schedule 13.10.2014
comment
У вас есть Observable для событий нажатия кнопки? Может быть, вы можете написать какой-нибудь псевдокод, чтобы помочь нам понять ваше дело.   -  person zsxwing    schedule 13.10.2014
comment
Я отредактировал свой ответ, надеюсь, теперь будет понятнее   -  person user3274539    schedule 14.10.2014
comment
андроид, однако самое главное это идея, как можно решить такую ​​проблему без использования сабжей   -  person user3274539    schedule 14.10.2014


Ответы (1)


Поскольку вы пишете приложение для Android, вы можете использовать RxAndroid. Вот пример,

    Observable.just(1).flatMap(new Func1<Integer, Observable<Integer>>() {

        @Override
        public Observable<Integer> call(Integer initialValue) {
            return ViewObservable.clicks(button, false)
                    .subscribeOn(AndroidSchedulers.mainThread())
                    .scan(initialValue, new Func2<Integer, View, Integer>() {

                        @Override
                        public Integer call(Integer integer, View v) {
                            return integer + 1;
                        }
                    });
        }
    }).subscribe(new Observer<Integer>() {

        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable e) {
            e.printStackTrace();
        }

        @Override
        public void onNext(Integer integer) {
            System.out.println(integer);
        }
    });

Я не уверен, что ты этого хочешь. Возможно, вам нужно только:

    ViewObservable.clicks(button, false)
            .subscribeOn(AndroidSchedulers.mainThread())
            .scan(1, new Func2<Integer, View, Integer>() {

                @Override
                public Integer call(Integer integer, View v) {
                    return integer + 1;
                }
            }).subscribe(new Observer<Integer>() {

        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable e) {
            e.printStackTrace();
        }

        @Override
        public void onNext(Integer integer) {
            System.out.println(integer);
        }
    });
person zsxwing    schedule 14.10.2014