根据我的理解,
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
我可以看到它按预期工作!
所以主题发生了什么
答案 0 :(得分:3)
从帖子Using subjects(由官方RxJava Subject文档链接),它声明:
默认情况下,主题不会跨线程执行任何同步。他们不接受调度程序,而是假设所有序列化和语法正确性都由主题的调用者处理。
所以,据我所知,这意味着所使用的线程是调用onNext()
的代码之一,后来被发送到观察到的线程。