使用Rxjava创建队列流

时间:2018-04-10 19:48:11

标签: java rx-java2

我必须创建一个执行流,其中必须执行一系列Observable,一些是并行的,另一些则等待执行并行执行。这些Observables操纵传递给其他人的数据。例如,Observable 2处理稍后必须由Observable 4使用的数据。

总之,流程应该是这样的:

时间------------------------->

  1. -Observable 1(获取数据库数据。与2并行)
  2. -Observable 2(操纵现有的ArrayList以备将来使用)
  3. ----- Observable 3(获取另一个数据库的数据。执行1次和2次后,因为使用了两者的数据)
  4. --------- Observable 4(操作结果为3,使用列表结果创建另一个列表.3之后)
  5. ------------- Observable 5(结果为4,我将在数据库中插入日志数据.4之后与6并行)
  6. ------------- Observable 6(创建一个返回实际方法的结果列表)
  7. 并行执行某些可观察对象,等待执行终结的其他可观察对象,以及等待执行的其中一个或多个也可以并行执行。

    我一直在尝试各种方式,创建Observable列表并在.zip中运行(在每个observable中使用.observeOn(Schedulers.computation())),我也尝试过.zipWith。但没有成功。

1 个答案:

答案 0 :(得分:1)

我们假设你有这些方法:

Single<List<DataType1>> getData1()

Single<List<DataType2>> manipulateList2(List<DataType2> list2)

Single<List<DataType3>> getData3(List<DataType1> list1, List<DataType2> list2)

Single<List<DataType4>> manipulateList4(List<DataType3> list3)

Completable insertLog(List<DataType4> list4)

Single<List<ResultType>> createResult(List<DataType4> list4)

然后您可以根据需要组合这些

Single<List<ResultType>> result = Single.zip(
    getData1().subscribeOn(Schedulers.io()),
    manipulateList2(sourceList2).subscribeOn(Schedulers.computation()),
    (list1, list2) -> getData3(list1, list2)
)
.flatMap(v -> v)
.flatMap(list3 -> manipulateList4(list3))
.flatMap(list4 -> 
    insertLog(list4).subscribeOn(Schedulers.io())
    .andThen(createResult(list4).subscribeOn(Schedulers.computation()))
);

return result;

zip允许同时运行同一个基本被动类型的多个来源,flatMap充当延续,andThen让你运行Completable和{{1}一起。