在concat observables时管理线程调度程序

时间:2016-08-20 11:28:02

标签: android rx-java

我有这样的代码:

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)错误。为什么?我正在使用和NetworkOnMainThreadExceptionsubscribeOn运算符,但它似乎并未应用于&#34; final&#34;建立了Observable。

如果我在API调用中使用此运算符,则在DAO中,它可以工作:

observeOn

有没有办法在&#34; root&#34;中使用一次?可观察到的?

2 个答案:

答案 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