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