前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxJava 中的 Subject测试

RxJava 中的 Subject测试

作者头像
iOSDevLog
发布2018-05-17 11:02:19
1K0
发布2018-05-17 11:02:19
举报
文章被收录于专栏:iOSDevLog

PublishSubject

Publish是Subject的一个基础子类。发送订阅后的数据流。

代码语言:javascript
复制
PublishSubject<Integer> publishSubject = PublishSubject.create();

BehaviorSubject

BehaviorSubject会首先向他的订阅者发送截至订阅前最新的一个数据对象(或初始值),然后正常发送订阅后的数据流。

代码语言:javascript
复制
BehaviorSubject<Integer> behaviorSubject = BehaviorSubject.create(0);

我们创建了一个能发射整形(Integer)的BehaviorSubject。由于每当Observes订阅它时就会发射最新的数据,所以它需要一个初始值。

ReplaySubject

ReplaySubject会缓存它所订阅的所有数据,向任意一个订阅它的观察者重发:

代码语言:javascript
复制
ReplaySubject<Integer> replaySubject = ReplaySubject.create();

AsyncSubject

当Observable完成时AsyncSubject只会发布最后一个数据给已经订阅的每一个观察者。

代码语言:javascript
复制
AsyncSubject<Integer> asyncSubject = AsyncSubject.create();

测试


代码语言:javascript
复制
    @Test
    public void observerTest() {
        PublishSubject<Integer> publishSubject = PublishSubject.create();
        BehaviorSubject<Integer> behaviorSubject = BehaviorSubject.create(0);
        ReplaySubject<Integer> replaySubject = ReplaySubject.create();
        AsyncSubject<Integer> asyncSubject = AsyncSubject.create();

        List<Subject> subjects = new ArrayList<>();
        subjects.add(publishSubject);
        subjects.add(behaviorSubject);
        subjects.add(replaySubject);
        subjects.add(asyncSubject);

        for (Subject subject :
                subjects) {
            System.out.println("--------------------------------\n" + subject.getClass().getSimpleName() + " start");
            subject.onNext(-3);
            subject.onNext(-2);
            subject.onNext(-1);
            subject.subscribe(new Subscriber<Integer>() {
                @Override
                public void onCompleted() {
                    System.out.println("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("onError(");
                }

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

            subject.onNext(1);
            subject.onNext(2);
            subject.onNext(3);
            subject.onCompleted();

            System.out.println(subject.getClass().getSimpleName() + " end\n================================\n");
        }
    }
代码语言:javascript
复制
--------------------------------
PublishSubject start
1
2
3
onCompleted
PublishSubject end
================================

--------------------------------
BehaviorSubject start
-1  # 如果前面没有发送数据, 此处会显示 0
1
2
3
onCompleted
BehaviorSubject end
================================

--------------------------------
ReplaySubject start
-3
-2
-1
1
2
3
onCompleted
ReplaySubject end
================================

--------------------------------
AsyncSubject start
3
onCompleted
AsyncSubject end
================================
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PublishSubject
  • BehaviorSubject
  • ReplaySubject
  • AsyncSubject
  • 测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档