2016-08-20 93 views
0

我有这样的代码管理线程调度service - >dao - >api。方法api.getUserById(id)进行网络呼叫。时CONCAT可观测量

我得到NetworkOnMainThreadException错误。为什么?我正在使用和subscribeOnobserveOn运算符,但它似乎不适用于“最终”构建的Observable。

如果我在API调用使用该运营商,在DAO,它的工作原理:

​​

有没有到刚刚在“根”,一旦使用方式可观察?

+0

你的错误出现在'api.getUserById(id)'中,你可以通过'api.getUserById(id).subscribeOn(Schedulers.io())'来修复它,这意味着**你应该包含你的'api .getUserById()'** – EpicPandaForce

回答

1

因此,concatMap订阅Observables。什么线程用于执行此操作?那么,concatMat线程调用onNext,因为它不会更改线程/调度程序。所以,一个简单的换位应该帮助这个:

service.getUserById(10) 
    .subscribeOn(Schedulers.newThread()) 
    .concatMap(getFullUserFromDto()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(doSomehingWithUser()); 

我也建议使用Schedulers.io(),因为它会重新使用线程。

0

简短的回答:使用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

+0

那么,为什么我会得到NetworkOnMainThreadException? –

+0

不想成为Captain明显,但是因为你在主线程上执行网络操作,在'AndroidSchedulers.mainThread()'中。我想你可以通过打印出当前线程Thread.currentThread()来调试你的代码,这应该能够更深入地了解正在发生的事情 – Entea