Rx2 blockingFirst()不起作用

时间:2017-05-25 15:22:00

标签: rx-java rx-android rx-java2 reactivex

我在rx世界中介绍,我想了解为什么在订阅newThread时阻塞不起作用。例如:

这是有效的:

int i = Observable.fromArray(1,2,3,4).blockingFirst();

这不起作用:

int i = Observable.just(1,2,3,4)
      .subscribeOn(Schedulers.newThread())
      .observeOn(AndroidSchedulers.mainThread()).blockingFirst();

如果有可能使第二种情况有效。

谢谢;)

1 个答案:

答案 0 :(得分:7)

运算符observeOn(AndroidSchedulers.mainThread())将排队所有发出的项目,以便在Android应用程序的主线程中发出。如果你在主线程中执行上面的代码片段,线程将在blockingFirst方法中阻止,并且没有任何机会执行项目的排队指令 - 它'陷入僵局。

通常,在Rx代码中使用blocking是一种反模式;它更容易保持在被动模式并执行以下操作:

Observable
.just(1,2,3,4)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(i -> {...})
.subscribe();