0

我正在使用 RxJava3,并且我有以下代码设置,我想在中间发出一个项目,在第一个和第二个 flowable 之间。有没有办法做到这一点?

firstFlowable.firstElement()
//I want to emit an item here
.flatMap { secondFlowable.firstElement() }

我想这样做的原因是因为在firstFlowable初始化之后有很长一段时间直到secondFlowable初始化,我想用一条消息通知 UI 操作已经开始,我正在等待来自secondFlowable.

我尝试使用startWithItem,但它在开始时初始化了我的整个链,但我只想在firstFlowable产生它的第一个值之后发出。

4

2 回答 2

0

也许您可以使用concatWith()withtake()skip()for firstFlowable

public static void main(String[] args) {
   Flowable<String> firstFlowable = Flowable.just("1st", "2nd", "3rd", "4th", "5th");
   Flowable<String> middleFlowable = Flowable.just("between");
   Flowable<String> secondFlowable = Flowable.just("A", "B", "C", "D");

   firstFlowable.take(1)
                .concatWith(middleFlowable)
                .concatWith(firstFlowable.skip(1))
                .concatWith(secondFlowable)
                .subscribe(System.out::println);

   Flowable.timer(10, SECONDS).blockingSubscribe();  // Just to block the main thread for a while
}

这给出了类似的东西:

1st
between
2nd
3rd
4th
5th
A
B
C
D
于 2021-04-30T16:49:53.863 回答
0

您可以使用合并来注入一个值,然后根据值类型进行操作。如果secondFlowable立即完成,您可能希望避免显示字符​​串 via takeUntil

firstFlowable.firstElement()
.flatMap(v ->
    Maybe.<Object>merge(
        secondFlowable.firstElement(),
        Maybe.just("Second in progress")
    )
)
.takeUntil(v -> !(v instanceof String))
.observeOn(mainThread())
.subscribe(v -> {
   if (v instanceof String) {
       // display message here
   } else {
       // cast and display results of second
   }
});
于 2021-05-03T09:40:59.930 回答