RxJava科目有必要吗?

Posted

技术标签:

【中文标题】RxJava科目有必要吗?【英文标题】:RxJava subjects are necessary? 【发布时间】:2014-10-12 21:34:42 【问题描述】:

我刚刚开始学习 RxJava 并思考反应式。 我发现一些文章(7 个技巧)说主题应该只作为最后的手段或第一个实现,我一直在想.. 截至目前,我有一个 PublishSubject

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

每次加1,被replaySubject订阅

ReplaySubject.create();

这只是打印值。所以一开始我有 0,然后在每个PublishSubject.onNext 上我都在增加值,所以我得到了 1、2 等。因为它的 replaySubject 我得到了整个链。 但是我一直在想这是否可以在没有科目的情况下完成?我一直在阅读 RxJava Wiki 和操作符,但我不知道有什么办法可以做到这一点。

更新

所以我试图归档的伪代码以某种方式具有一个以 1 开头的 observable

Observable.just(1)

现在我确实有点击监听器

OnClick 

每次我点击某个按钮时,我都想查看所有以前的数字 + 1,所以 1 然后是 1,然后是 2,然后是 1、2、3 等等。 我一直在尝试ConnectableObservator.replay,但这根本没有成功。在侦听器内部,我一直在尝试首先在我的 Observable 上添加扫描以增加价值,然后订阅以便我可以打印它。但这也不起作用。该死的,我认为我在一个黑暗的角落,误解了 observables 的概念......

【问题讨论】:

你想重播PublishSubject的项目吗? 我想消除 PublishSubject 和 ReplaySubject,因为我可以通过某种方式将我的值从 0 增加到 x 让我们说鼠标单击 为什么observable.scan(0, (a, b) -> a + 1) 不起作用? 确实如此,但假设我有Observable.just(0) 和一个按钮点击事件,现在我有一个订阅者订阅我的Observable 并打印它的值。所以它打印 0。现在我在每次按钮单击时都想增加该值并将其发送给所有订阅者,我可能还不了解整个想法 你有按钮点击事件的 Observable 吗?也许你可以写一些伪代码来帮助我们理解你的情况。 【参考方案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);
        
    );

【讨论】:

以上是关于RxJava科目有必要吗?的主要内容,如果未能解决你的问题,请参考以下文章

rxjava 这个类库有必要学么。

全民响应式编程,你还不懂RxJava吗

干掉RxJava系列--1. 手写权限请求替代RxPermission

我们真的需要使用RxJava+Retrofit吗?

通过 Observable(RxJava) 使用 Kafka

RxJava 和 Realm 请求使应用程序跳帧