【问题标题】:Rx2 blockingFirst() doesn't workRx2 blockingFirst() 不起作用
【发布时间】:2017-05-25 15:22:00
【问题描述】:

我正在介绍 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();

如果有可能使第二种情况起作用。

谢谢 ;)

【问题讨论】:

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


    【解决方案1】:

    操作符observeOn(AndroidSchedulers.mainThread()) 将在Android 应用程序的主线程中将要发射的所有发射项排队。如果你在主线程中执行上面的 sn-p,线程将在blockingFirst 方法中阻塞,并且没有任何机会执行队列中的指令——这是一个死锁。

    一般来说,在 Rx 代码中使用blocking 是一种反模式;保持在响应模式并执行以下操作会更容易:

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

    【讨论】:

    • 我也遇到了这个问题,当我使用.observeOn(Schedulers.io()) 时它的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多