【问题标题】:RxJava subscribeOn and observeOn not override the original Scheduler set before?RxJava subscribeOn 和 observeOn 不会覆盖之前设置的原始 Scheduler?
【发布时间】:2016-06-10 10:35:34
【问题描述】:

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

【问题讨论】:

  • 所以,一切都应该正常。如果您显示一些代码示例会更好。

标签: android rx-java


【解决方案1】:

这正是 RxJava 的工作方式。

看看this video tutorial,从 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() 方法,我建议你看看视频同一作者的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);

希望对您有所帮助。

【讨论】:

  • 非常感谢,您的回答对我很有帮助。在我阅读了源代码之后。我发现 Observable.just(1, 2, 3).subscribeOn(Schedulers.newThread()).subscribeOn(Schedulers.io()).subscribe(System.out::println);将分叉 3 个线程,originalThread -> newThread -> ioThread。所以最后,prinln 方法将在从 newThread 创建的 ioThread 处调用,而 newThread 是从 originalThread 创建的。
  • 另外,作为对此的后续,Dan Lew 写了一篇文章来涵盖这一点:blog.danlew.net/2015/03/02/dont-break-the-chain
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 2015-05-03
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多