RxJava - 使用mergeWith运算符时的blockingGet()方法会停止线程

时间:2017-12-13 05:01:36

标签: rx-java blocking rx-java2

我有一个用例,我需要一个反馈循环,根据某些条件从已经发出的项目中发出一个项目。

示例代码:

    Flowable<Integer> range1 = Flowable.range(1, 10);
    UnicastProcessor<Integer> publishProcessor = UnicastProcessor.create();

    Single<List<Integer>> pollResponse =  range1
            .mergeWith(publishProcessor) //On Commenting this line code works without wanted behaviour
            .map(integer -> {
                if (integer % 2 == 0 && integer <= 10) {
                    publishProcessor.onNext(20 + integer);
                }
                return integer;
            })
            .flatMap(integer -> flatMapMock(integer, publishProcessor))
            .toList()
            .doOnError(throwable -> System.out.println(throwable));

    List<Integer> integers = pollResponse.blockingGet();
    System.out.println(integers.size());

flatMapMock函数:

private static Flowable<Integer> flatMapMock(Integer integer, 
    FlowableProcessor<Integer> feedbackSource){

    return Flowable.just(integer)
            .map(integer1 -> integer1);
}

我的问题是:

  • 如果我没有将publishProcessor与range1 flowable合并,那么我 到达打印列表大小。 然而,合并为什么不 它有用吗?
  • 我在这里错过了什么吗?任何指针都没问题。

1 个答案:

答案 0 :(得分:2)

问题是您正在使用需要有限流的case XMLStreamConstants.START_ELEMENT: StartElement startElement = event.asStartElement(); String startTag = startElement.getName().getLocalPart(); break; case XMLStreamConstants.COMMENT : ???? ,但是您合并了toList,它永远不会完成,因此UnicastProcessor永远不会完成。你应该重新考虑你想要达到的目标。