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才可能。