RxJava Android AmbWith 运算符导致 NetworkOnMainThread 异常

RxJava Android AmbWith Operator causes NetworkOnMainThread Exception

我目前正在 Android 上试验 RxJava,在尝试将 AmbWith 运算符与两个 Observable 一起使用时遇到了问题。

正如我在此处的 amb 定义中所理解的 http://reactivex.io/documentation/operators/amb.html

只接受第一个发送通知的 Observable,其余的忽略并丢弃。

我连接了两个 Observable,一个进行网络调用(带有改造) 另一个用内存中的数据响应。

此代码如下所示:

    retrofitService.loadInfo()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            //the observable here returns an item from in memory and should be observed on the ui thread
            .ambWith(observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()))
            .subscribe(action);

现在的问题是,如果第二个 observable 首先发出一个项目(这很可能)第一个 observable 被取消。如果 web 服务已经启动,这将导致 NetworkOnMainThread。

如果我删除

就可以正常工作
    .observeOn(AndroidSchedulers.mainThread()

对于第二个 Observable,但我需要 ui 中的结果。

我的猜测是,amb 运算符是在主线程上执行的,并且取消操作以某种方式在主线程中结束。

我错过了什么吗? 有人知道如何解决这个问题吗?

感谢任何帮助。

您的 observeOn 仅影响原始 Observable,因此,我认为这可能会有所帮助:

retrofitService.loadInfo()
            .subscribeOn(Schedulers.newThread())
            .ambWith(observable.subscribeOn(Schedulers.newThread()))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(action);

现在,所有结果都将在主线程中。检查一下。

感谢您的回复,现在可以了。你的回答给了我最后的提示 运行。只需在主线程中解决最终结果就可以了。 我尝试了一下,所以这里有一个直接使用 amb() 运算符的替代方法。也许它可以帮助遇到类似问题的人。

    Observable o = Observable.create(amb(retrofitService.loadInfo()
            .subscribeOn(Schedulers.newThread())
            ,observable.subscribeOn(Schedulers.newThread())))
            .observeOn(AndroidSchedulers.mainThread());

    o.subscribe(action);

再次感谢!