2015-07-11 28 views
0

我想知道如何在Observable的线程中发出Observable发送的数据,而无需更改数据。 例如,我请求任务列表从服务器,并打印出来使用RxJava中的可观察线程对数据“只读”做些什么

//Assume that taskService.getTasks returns an Observable<List<Task>> 
    Observable<List<Task>> observable = taskService.getTasks(...).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulars.mainThread()); 
    observable.subscribe(tasks -> { 
     for(Task task: tasks) System.out.println(task); 
    }); 

但后来我想将任务列表保存到磁盘作为缓存。我如何使用运营商在订阅线程中做到这一点? 我发现了类似的运营商如map,但后来我不得不返回我做保存到磁盘后任务列表:

Observable<List<Task>> observable = taskService.getTasks(...).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); 
    observable.map(tasks1 -> { 
     saveToDisk(tasks1); 
     return tasks1;  //Here, I have to return the tasks 
    }); 
    observable.subscribe(tasks -> { 
     for(Task task: tasks) System.out.println(task); 
    }); 

本质map意在这种或那种方式来转换数据。在这种情况下,我只是想将这些任务保存到磁盘上而不改变它的任何内容。 map不是为此构建的,而且map中的return语句是多余的。 我也发现doOnNextdoOnEach做我想做的,但这两个运算符在观察者的线程中运行代码。在上面的例子中,这是android的主线程。这也不好。 有没有什么办法,以使

+2

我想你应该能够把一个'observeOn(Schedulers.io())上面的' 'doOnNext()'(和一个'observeOn(AndroidSchedulers.mainThread())')将'Action1'移动到IO线程。你尝试过吗? –

+0

一个简单的解决方案是使'saveToDisk'返回'列表'。这样你可以使用方法引用:'observable.map(this :: saveToDisk)'。 –

+0

@Egor N那么我必须显式''在'saveToDisk'中返回列表',因为Java中没有隐式返回,就像ruby一样。使用'doOnNext',我仍然可以在不使用return语句的情况下使用方法引用。 –

回答

1

我认为以下应在后台线程上运行saveToDisk:

Observable<List<Task>> observable = taskService.getTasks(...) 
    .doOnNext(tasks1 -> { 
     saveToDisk(tasks1) 
    }) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()); 

observable.subscribe(tasks -> { 
    for(Task task: tasks) System.out.println(task); 
}); 
+1

是的,重点是在观察之前移动doOnNext,请参阅@ david.mihola提问下面的注释。 –

+0

@ Chris.Zou,请添加一个新答案,以便我可以upvote你,你为我节省了很多时间! –

相关问题