sequential()
运算符是否将ParallelFlowable
转换为Flowable
流,这些流在剩余的并行任务仍在运行时或者仅在完成后才会发出项目?
例如:
考虑到我有5个需要并行执行的长时间运行的时变任务。我使用执行这些任务的ParallelFlowable
;之后我添加了sequential()
运算符;然后是take(1)
运算符。我会...:
ParallelFlowable
转换为Flowable
?我希望它应该是上述的优先事项,但需要确认。
答案 0 :(得分:1)
如果您不确定RxJava在某些简单情况下的行为,最好的方法是使用几个System.out.println()
或.test()
和一些.assertValues()
来编写一个小程序或单元测试/ .assertNotComplete()
/等。在不同的地方,看看在何时何地发生的事情。
source
.doOnNext(v -> System.out.println("Source sent: " + v))
// .operator1()
// .operator2()
// etc.
RxJava是一个组合库,这意味着您可以经常隔离源,处理逻辑和最终使用者,以便对它们进行单独测试。例如,您可以使用发出常量响应的简单Observable.just()
替换网络呼叫。在其他情况下,您可以创建PublishSubject
并逐步调用onNext
,检查每个后的预期状态。
PublishSubject<Integer> publishSource = PublishSubject.create();
Observable<Integer> squares = publishSource
.map(v -> v * v);
为此,您经常需要将处理逻辑分解为所谓的函数变换器方法,该方法采用类型但无约束的源(即PublishSubject
)并返回其他类型({ {1}})由测试消费者使用并验证。
Observable
最后,您可以使用最后一个 public static Observable<Integer> square(Observable<Integer> source) {
return source.map(v -> v * v);
}
Observable<Integer> squared = square(Observable.just(2));
Observable<Integer> anotherSqr = square(publishSource);
来源或只是看看您可以打印到控制台的内容:
Observable
如果转换涉及异步或定时延迟,您可以插入 square(publishSource
.doOnNext(v -> System.out.println("Input: " + v))
)
.subscribe(
v -> System.out.println("Output: " + v),
Throwable::printStackTrace,
() -> System.out.println("Done")
);
publishSource.onNext(1);
// Input: 1
// Output: 2
publishSource.onNext(2);
// Input: 2
// Output: 4
publishSource.onComplete();
// Done
,以便可以在输出/断言中分离对多个输入的响应。
(至于您的想要确认,Thread.sleep()
并不等待所有项目完成,它会在任何并行轨道发布后立即发出并且下游已准备好接收它们。)