RxJava subscribeOn和observeOn不会覆盖之前设置的原始Scheduler?

时间:2016-02-27 01:59:08

标签: android rx-java

我在Android中使用了RxJava和Retrofit 2,我在subscribe()之前调用了subscribeOn(Schedulers.io())android observeOn(AndroidSchedulers.mainThread())全局。 但是,有时我想调用subscribeOn(Schedulers.immediate())android observeOn(Schedulers.immediate())来覆盖Scheduler之前设置的同步进程。但我发现它不起作用,android工作仍然会在io()线程上处理,android结果由mainThread()处理。 为什么呢?

1 个答案:

答案 0 :(得分:6)

这就是RxJava的工作方式。

从12:50开始看看this video tutorial。所以给出视频中的例子:

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()方法,建议您查看同一位视频作者的this post。他建议的是使用Transformer来包含对这些方法的调用:

  

Transformer实际上只是Func1<Observable<T>, Observable<R>>。在   换句话说:给它一个Observable类型的它,它会返回一个   另一个Observable。这与调用一系列内容完全相同   运营商内联。

这样,您可以使用如下方法:

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

或者,如果您想重复使用变压器,可以进行以下设置:

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);

希望有所帮助。