微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在等待另一个 Flowable 发射时发射一个项目

如何解决如何在等待另一个 Flowable 发射时发射一个项目

我正在使用 RxJava3 并且我有以下代码设置,我想在中间发出一个项目,在第一个和第二个可流动之间。有办法吗?

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

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

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

解决方法

也许您可以将 concatWith()take()skip() 一起用于 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
,

您可以使用合并来注入一个值,然后根据值类型进行操作。如果 secondFlowable 立即结束,您可能希望避免通过 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
   }
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。