Java 次刺激对受试者没有影响
据我了解,Java 次刺激对受试者没有影响,java,android,rx-java,rx-java2,Java,Android,Rx Java,Rx Java2,据我了解, SubscribeOn操作符指定 可观测源应开始发射 如果链上有多个订阅,则第一个订阅 对整个流的影响 ObserveOn可用于随时将线程翻转到下游 点,当链中出现观测值时,它会更改 下游螺纹 但是我尝试了一个带有主题的示例,我发现SubscribeOn在整个链中没有效果 这是我的样品 Subject<String> mSubject = PublishSubject.create(); 从其他地方触发 mSubject.onNext
操作符指定 可观测源应开始发射SubscribeOn
- 如果链上有多个
订阅,则第一个订阅 对整个流的影响
可用于随时将线程翻转到下游 点,当链中出现ObserveOn
观测值时,它会更改 下游螺纹
主题
的示例,我发现SubscribeOn
在整个链中没有效果
这是我的样品
Subject<String> mSubject = PublishSubject.create();
从其他地方触发
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)
直到这些命令在调度程序线程中执行。然后我使用observeOn
将线程翻转到主线程。但是这里是这个代码的日志
D/MainActivity: Started at Thread :main
D/MainActivity: subscribed: 1 at main
为什么它没有在调度程序线程上启动
同样,我尝试使用正常的可观察的而不使用主题
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
我可以看到它正在按预期工作
因此,这篇文章(由官方RxJava文档链接)中的主题发生了什么,它指出:
默认情况下,主题不跨线程执行任何同步。它们不采用调度程序,而是假定所有序列化和语法正确性都由主题的调用方处理
因此,据我所知,这意味着所使用的线程是调用onNext()
的代码之一,然后被发送到观察到的线程。我刚刚注意到我链接的文档是针对RxJS的。。。但是对于RxJava来说是有意义的(甚至比Javascript更重要,因为通常不使用线程)。主题没有订阅副作用,调用Subject.onNext
的线程将是观察者接收值的线程。你也可以读到:@akarnokd读得很好,谢谢!
D/MainActivity: Started at Thread :RxCachedThreadScheduler-2
D/MainActivity: subscribed: 1 at main