2015-09-28 53 views
5

在我的项目中,我需要处理不同线程中的对象。要操作流的行为,我创造新的观测,以改变他们的observeOn()这样:操作线程的有效方法RxJava

apiService.getObjects(token) // Retrofit 
       .compose(bindToLifecycle()) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .doOnNext(o -> { 
        // process in Main Thread 
       }) 
       .map(Observable::just) // create new one, to change thread for it 
       .observeOn(Schedulers.io()) 
       .subscribe(o -> { 
        // process in the background thread 
       }); 

但我认为RxJava还有更多的美丽和有效的方式来处理不同的线程一个响应。我试图谷歌它,但我没有找到任何东西。

感谢,
安东

回答

3

处于RX,它通常建议避免在“做”块副作用(如果流大干快上订阅的,才执行),并且更喜欢订阅代码。

在你的情况,你可以利用cache()publish()...connect(),如:

query = apiService.getObjects(token) 
      .compose(bindToLifecycle()) 
      .subscribeOn(Schedulers.io()) 
      .cache(); 

query.observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(o -> { 
       // process in Main Thread 
      }) 
query.observeOn(Schedulers.io()) 
      .subscribe(o -> { 
       // process in the background thread 
      }); 

随着publish()代替cache(),该代码是相同的,但你可以通过连接流决定何时启用你的查询(你在连接2个订阅后,请拨打query.connect())。

如果您的订阅工作是后台计算,Schedulers.computation()可能优于Schedulers.io()

注意AFAICT您的代码将工作没有map(Observable::just)线就好了,因为“observeOn”语句只影响流进一步回落(而不是以前的“做”语句)

+0

如何计算的?你能解释发布 - >连接吗? –

+0

我更新了答案以涵盖这2个问题 – Gluck