Android 订阅是如何工作的
我对使用Android 订阅是如何工作的,android,rx-java2,Android,Rx Java2,我对使用subscribeOn操作符有一些疑问。我读了一些关于这方面的文章 observeOn很容易理解,它只改变下行轨道,而改变会影响所有的下游 但正如文章所述: 为了理解这一点,我做了一个samlpe并尝试在每个时间点记录线程 Observable.just("Hello") .map(s -> { Log.d(TAG, s + " in " + Thread.currentT
subscribeOn
操作符有一些疑问。我读了一些关于这方面的文章
observeOn
很容易理解,它只改变下行轨道,而改变会影响所有的下游
但正如文章所述:
为了理解这一点,我做了一个samlpe并尝试在每个时间点记录线程
Observable.just("Hello")
.map(s -> {
Log.d(TAG, s + " in " + Thread.currentThread());
return 1;
})
.subscribeOn(Schedulers.newThread())
.map(integer -> {
Log.d(TAG, integer + " in " + Thread.currentThread());
return true;
})
.map(aBoolean -> {
Log.d(TAG, aBoolean + " in " + Thread.currentThread());
return 11.0;
})
.subscribeOn(Schedulers.computation())
.subscribe(aDouble -> {
Log.d(TAG, "accept in " + Thread.currentThread());
Log.d(TAG, "accept: " + aDouble);
});
结果是
Hello in Thread[RxNewThreadScheduler-1,5,main]
1 in Thread[RxNewThreadScheduler-1,5,main]
true in Thread[RxNewThreadScheduler-1,5,main]
accept in Thread[RxNewThreadScheduler-1,5,main]
accept: 11.0
这里我两次应用subscribeOn
,但每次第一次添加的订阅似乎都应用于整个流
谁能用简单的话解释一下它到底是如何工作的,因为我是个初学者,很难理解
提前感谢
订阅
:如果您有多个订阅
,则第一个订阅生效。如果要在订阅后更改流上的调度程序,请查看observeOn
observeOn
:它会更改下游的调度程序
例如:
just("Some String") // Computation
.subscribeOn(Schedulers.computation()) // it changes scheduler to computation beginning from source to observer.
.map(str -> str.length()) // Computation
.observeOn(Schedulers.io) //change the scheduler from here till the observer
.map(length -> 2 * length) // io
.subscribe(number -> Log.d("", "Number " + number));// io
subscribeOn
:如果您有多个subscribeOn
,则第一个生效。如果要在订阅后更改流上的调度程序,请查看observeOn
observeOn
:它会更改下游的调度程序
例如:
just("Some String") // Computation
.subscribeOn(Schedulers.computation()) // it changes scheduler to computation beginning from source to observer.
.map(str -> str.length()) // Computation
.observeOn(Schedulers.io) //change the scheduler from here till the observer
.map(length -> 2 * length) // io
.subscribe(number -> Log.d("", "Number " + number));// io
如果我没记错的话,
subscribeOn
描述了开始,即哪个线程将开始发射。如果有多个声明,则只使用第一个声明。最接近可观察到的wins的subscribeOn
。第二个是IgnoredSubscribeen,它将用于创建可观察对象。因此,只能从线程上进行创建,因此对于一个可观察对象,只能使用subscribeOn。如果我没记错的话,subscribeOn
描述了开始,即哪个线程将开始发射。如果有多个声明,则只使用第一个声明。最接近可观察到的wins的subscribeOn
。第二个是IgnoredSubscribeen,它将用于创建可观察对象。因此,只有从线程上才能创建,所以对于一个可观察对象,只有subscribeOn才可能。