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);
再次感谢!
我目前正在 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);
再次感谢!