Rxjava合并多个obsevables而不交错流

时间:2016-10-10 08:37:55

标签: rx-java fifo

data fetching flow (updated)- each flow use its own thread (Scheduler.io)

我是Rxjava的初学者,我无法弄清楚如何用Rxjava方式表达红色和黄色箭头。

我遇到的困难是:

  1. 收集所有可观察数据,但不进行交错。

  2. 的数量
  3. observable是可变的,而不是红色箭头中的固定数字。

  4. 我看书和搜索但是越来越头痛,我不知道应该走哪条路。对于红色箭头部分,我可以像往常一样使用阻塞队列,但是用Rxjava方式编写整个链可能更好。

1 个答案:

答案 0 :(得分:0)

我不确定我能理解这个问题。

假设这是一个问题:

  • 您从生成数据列表List<DATA>的任务开始,让我们称之为批量数据;
  • 所有这些任务在线程池中并行执行;
  • 您收到这些批次并处理它们
  • 您不关心批次的顺序,但是您要关注这些批次中元素的内部顺序
  • 您正尝试将此迁移到RxJava

据我所知,你已经开始了,你的任务现在正在生成Observable<Data>代替List<DATA>

这是我要改变的第一件事:因为你关心批次的内部顺序,我会保留列表,从而使你的任务返回Observable<List<DATA>>

所以你最终会得到一堆Observable<List<DATA>>,每个并行任务一个:

List<Observable<List<DATA>>> tasks = ...;
List<Observable<List<DATA>>> parallelTask = new Arraylist(tasks.size());
for (Observable<List<DATA>> task : tasks) {
    // execute all the task in a separate thread
    // change Schedulers to your own pool schedulers if you want
    parallelTask.add(task.scheduleOn(Schedulers.io()));
}
Observable.merge(parallelTasks)
    .concatMap(batch -> Observable.from(batch)) // read below
    .observeOn(Schedulers.computation()) // or whichever thread you want to process the data
    .subscribe(data -> {
        // process data as it comes
    }, throwable -> {
        // handle error
    });

这就是它的作用

  1. 首先将所有批次可观察对象合并为一个可观察的
  2. 然后指定订阅应该发生的线程
  3. 然后concatMap将批处理(List<DATA>)转换为类型为DATA的事件流,保留其顺序(在此结束之前,您不会从不同批次获取数据)
  4. 然后指定要在其中观察数据并处理它们的线程
  5. 最后订阅数据来处理它们