我想知道如何在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语句是多余的。 我也发现doOnNext
或doOnEach
做我想做的,但这两个运算符在观察者的线程中运行代码。在上面的例子中,这是android的主线程。这也不好。 有没有什么办法,以使
我想你应该能够把一个'observeOn(Schedulers.io())上面的' 'doOnNext()'(和一个'observeOn(AndroidSchedulers.mainThread())')将'Action1'移动到IO线程。你尝试过吗? –
一个简单的解决方案是使'saveToDisk'返回'列表'。这样你可以使用方法引用:'observable.map(this :: saveToDisk)'。 –
@Egor N那么我必须显式''在'saveToDisk'中返回列表',因为Java中没有隐式返回,就像ruby一样。使用'doOnNext',我仍然可以在不使用return语句的情况下使用方法引用。 –