时CONCAT可观测量
我有这样的代码管理线程调度service
- >dao
- >api
。方法api.getUserById(id)
进行网络呼叫。时CONCAT可观测量
我得到NetworkOnMainThreadException
错误。为什么?我正在使用和subscribeOn
和observeOn
运算符,但它似乎不适用于“最终”构建的Observable。
如果我在API调用使用该运营商,在DAO,它的工作原理:
有没有到刚刚在“根”,一旦使用方式可观察?
因此,concatMap
订阅Observables。什么线程用于执行此操作?那么,concatMat
线程调用onNext
,因为它不会更改线程/调度程序。所以,一个简单的换位应该帮助这个:
service.getUserById(10)
.subscribeOn(Schedulers.newThread())
.concatMap(getFullUserFromDto())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(doSomehingWithUser());
我也建议使用Schedulers.io(),因为它会重新使用线程。
简短的回答:使用observeOn
链式操作之前CONTROLL上调度它们执行:
service.getUserById(10)
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.io())
.concatMap(getFullUserFromDto())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(doSomehingWithUser());
在上面的例子中,.concatMap
将在Schedulers.io()
更多细节执行可以在这里找到: http://tomstechnicalblog.blogspot.com/2016/02/rxjava-understanding-observeon-and.html
那么,为什么我会得到NetworkOnMainThreadException? –
不想成为Captain明显,但是因为你在主线程上执行网络操作,在'AndroidSchedulers.mainThread()'中。我想你可以通过打印出当前线程Thread.currentThread()来调试你的代码,这应该能够更深入地了解正在发生的事情 – Entea
你的错误出现在'api.getUserById(id)'中,你可以通过'api.getUserById(id).subscribeOn(Schedulers.io())'来修复它,这意味着**你应该包含你的'api .getUserById()'** – EpicPandaForce