android - RxJava Single to Completable to Single - 如何将第一个 Single 的结果传递给第二个 Single

标签 android rx-java2

在下面的方法中,如何将第一个Single的结果传递给第二个Single?

如现在所写,当它返回时,somethingId 是空的。如果我将返回的 Single.just(somethingId) 中的值更改为空字符串以外的值,它将返回该值。

有趣的是,如果我在方法中设置断点,它会在第 7 行停止,然后再转到第 5 行和第 6 行。

第 7 行 andThen 的文档说:

Returns a Single which will subscribe to this Completable and once that is completed then will subscribe to the {@code next} SingleSource.

为什么它看起来是按那个顺序执行的和/或有更好的方法吗?

1 override fun downloadSomething(): Single<String> {
2    var somethingId = ""
3    return remoteDataSource.downloadSomething() // this is a Single
4        .flatMapCompletable { something ->
5            somethingId = something.id
6            saveSomething(something) // this is a Completable
7        }.andThen(Single.just(somethingId))
8 }

此时我唯一能想到的就是为第 6 行的 saveSomething() 方法返回一个 Single(可行)。但是,我正在更改该方法的签名,以便我可以在这个感觉不对的特定方法中使用它。当然有一种方法可以使它在不这样做的情况下工作吗?

最佳答案

如果完全避免 flatMapCompletable 操作,您可以在不更改 saveSomething 方法签名的情况下获得相同的结果:

1 override fun downloadSomething(): Single<String> {
2    return remoteDataSource.downloadSomething() // this is a Single
3        .flatMap { something ->        
4            saveSomething(something).andThen(Single.just(something.id))
5        }
6 }

或者:

1 override fun downloadSomething(): Single<String> {
2    return remoteDataSource.downloadSomething() // this is a Single
3        .flatMap { something ->        
4           saveSomething(something).toSingleDefault(something.id)
5        }
6 }

您目前遇到的问题是 Single.just(somethingId) 作为 RxJava 管道创建的一部分执行,因此,它发生在 downloadSomething 完成之前,因此值somethingId 仍然是一个空字符串。

关于android - RxJava Single to Completable to Single - 如何将第一个 Single 的结果传递给第二个 Single,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50807932/

相关文章:

java - Android 相机捕获的 URI 解释

java - PublishSubject 在 `onError()` 之后停止发射

java - 在 Android 中使用 Room 和 RxJava 链接多个网络调用和数据库插入

android - Android SDK v4 中忽略的参数

android - 如何使用 NotificationCompat.Builder 和 startForeground?

android - Google Apps 中基于 Material Design 2 的自定义选择标签指示器

android - 推送消息无法立即启动服务

java - 将 ListenableFuture 链转换为等效的 RxJava 结构

java - 未进行 RxJava 2/Retrofit 2 调用

java - RxJava just() 计算线程