Android RxJava subscribeOn和observeOn是否覆盖以前的原始计划程序集?

Android RxJava subscribeOn和observeOn是否覆盖以前的原始计划程序集?,android,rx-java,Android,Rx Java,我在android中使用RxJava进行改型2,并在subscribe()之前调用了subscribeOn(Schedulers.io())android observeOn(AndroidSchedulers.mainThread())global。 然而,有时我想调用subscribeOn(Schedulers.immediate())android observeOn(Schedulers.immediate())来覆盖之前设置的调度程序,以获得同步进程。但我发现它不起作用,android

我在android中使用RxJava进行改型2,并在subscribe()之前调用了subscribeOn(Schedulers.io())android observeOn(AndroidSchedulers.mainThread())global。 然而,有时我想调用subscribeOn(Schedulers.immediate())android observeOn(Schedulers.immediate())来覆盖之前设置的调度程序,以获得同步进程。但我发现它不起作用,android works仍将在io()线程上处理,android结果由mainThread()处理。
为什么?

这正是RxJava的工作方式

看一看,从12点50分开始。因此,视频中给出了一个示例:

Observable.just(1, 2, 3)
    .subscribeOn(Schedulers.newThread())
    .subscribeOn(Schedulers.io())
    .subscribe(System.out::println);
发生的情况是
subscribeOn()
嵌套所有调用。在本例中,
subscribeOn(Schedulers.io())
首先生成,并在io线程上订阅它上面的所有内容。但是接下来会生成
subscribeOn(Schedulers.newThread())
,并且它会优先(因为它是上次调用的)订阅它上面的所有内容。没有建立一个线程链。在本例中,您实际上是在毫无理由地生成io线程

为了更好地处理
subscribeOn()
observeOn()
方法,我建议您看看视频的同一作者。他建议使用
转换器来包装对这些方法的调用:

Transformer
实际上只是
Func1
。在里面 换句话说:给它一个
可观察的
类型,它将返回一个
可观察到的
。这与调用一系列 运算符内联

通过这种方式,您可以获得如下方法:

<T> Transformer<T, T> applySchedulers() {  
    return observable -> observable.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread());
}

希望这能有所帮助。

所以,一切都应该顺利。如果你展示一些代码示例会更好。非常感谢,你的回答真的对我有帮助。在我读了源代码之后。我发现了Observable.just(1,2,3).subscribeOn(Schedulers.newThread()).subscribeOn(Schedulers.io()).subscribe(System.out::println);将分叉3个线程,originalThread->newThread->ioThread。最后,prinln方法将在ioThread调用,ioThread是从newThread创建的,newThread是从originalThread创建的。此外,作为后续内容,Dan Lew写了一篇文章,介绍了这一点:
final Transformer schedulersTransformer =  
    observable -> observable.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread());

@SuppressWarnings("unchecked")
<T> Transformer<T, T> applySchedulers() {  
    return (Transformer<T, T>) schedulersTransformer;
}
Observable.just(1, 2, 3)
    .compose(applySchedulers())
    .subscribe(System.out::println);