SubscibeOn对主题没有影响

时间:2017-12-28 06:29:26

标签: java android rx-java rx-java2

根据我的理解,

  • SubscribeOn运算符指定了其中的Thread 可观察的来源应该开始发射。
  • 如果链上有多个SubscribeOn,则第一个需要。{li> 对整个流程的影响。
  • ObserveOn可用于将线程翻转到任何位置的下游 一点,每当链中出现ObserveOn时,它就会改变 下游的线程

但我尝试使用Subject的示例,我可以看到整个链中的SubscribeOn没有效果。

这是我的样本

    Subject<String> mSubject = PublishSubject.create();

我像

一样消费它
             mSubject
            .map(s -> "String :" + s)
            .doOnNext(s -> Log.d(TAG, "Started at Thread :" + Thread.currentThread().getName()))
            .flatMap(s -> Observable.just(1))
            .map(Object::toString)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(s -> {
                Log.d(TAG, "subscribed: " + s + " at " + Thread.currentThread().getName());

            });

并从其他地方触发

            mSubject.onNext("hello");

在这里你可以看到,我已经给了.subscribeOn(Schedulers.io()),所以我希望

             mSubject
            .map(s -> "String :" + s)
            .doOnNext(s -> Log.d(TAG, "Started at Thread :" + Thread.currentThread().getName()))
            .flatMap(s -> Observable.just(1))
            .map(Object::toString)

直到这些在Scheduler Thread中执行。然后我将线程使用observeOn翻转到主线程。但这里是这段代码的日志

              D/MainActivity: Started at Thread :main
              D/MainActivity: subscribed: 1 at main

为什么它不在Scheduler线程上启动?

我尝试使用普通Observable而不使用主题。

             Observable.just("Hello")
            .map(s -> "String :" + s)
            .doOnNext(s -> Log.d(TAG, "Started at Thread :" + Thread.currentThread().getName()))
            .flatMap(s -> Observable.just(1))
            .map(Object::toString)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(s -> {
                Log.d(TAG, "subscribed: " + s + " at " + Thread.currentThread().getName());

            });

这是日志

             D/MainActivity: Started at Thread :RxCachedThreadScheduler-2
             D/MainActivity: subscribed: 1 at main

我可以看到它按预期工作!

所以主题发生了什么

1 个答案:

答案 0 :(得分:3)

从帖子Using subjects(由官方RxJava Subject文档链接),它声明:

  

默认情况下,主题不会跨线程执行任何同步。他们不接受调度程序,而是假设所有序列化和语法正确性都由主题的调用者处理。

所以,据我所知,这意味着所使用的线程是调用onNext()的代码之一,后来被发送到观察到的线程。