我有这样的代码:
total number of roll with status 1 | class_id | name
1 | 1 | CS4
3 | 2 | CS5
2 | 3 | CS6
在我的DAO中,我有:
service.getUserById(10)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.concatMap(getFullUserFromDto())
.subscribe(doSomehingWithUser());
private Func1<UserDto, Observable<User>> getFullUserFromDto() {
return new Func1<UserDto, Observable<User>>() {
@Override
public Observable<User> call(final UserDto dto) {
return dao.getUserById(dto.getUserId());
}
};
}
注意有两个级别的&#34;连接&#34;: public Observable<User> getUserById(final Long id) {
return api.getUserById(id).map(//more things...
}
- &gt; service
- &gt; dao
。方法api
进行网络呼叫。
我收到api.getUserById(id)
错误。为什么?我正在使用和NetworkOnMainThreadException
和subscribeOn
运算符,但它似乎并未应用于&#34; final&#34;建立了Observable。
如果我在API调用中使用此运算符,则在DAO中,它可以工作:
observeOn
有没有办法在&#34; root&#34;中使用一次?可观察到的?
答案 0 :(得分:1)
所以,concatMap
订阅了Observables。用什么线程来执行此操作?好吧,为onNext
调用concatMat
的线程,因为它不会更改线程/调度程序。因此,一个简单的换位应该有助于此:
service.getUserById(10)
.subscribeOn(Schedulers.newThread())
.concatMap(getFullUserFromDto())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(doSomehingWithUser());
我还建议使用Schedulers.io(),因为它会重用线程。
答案 1 :(得分:0)
简短回答:在链接操作之前使用observeOn
来控制执行它们的调度程序:
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