kotlin - 基于 bool 值的Rx Java调用Api

标签 kotlin retrofit rx-java

我是RX Java的新手,我知道如何使用zip或平面 map ,但是我有以下问题,我感到无法选择:

我有一种方法,我试图重构:

updateDetails(emailAddress: String?, updateEmail: Boolean,
                                     nickName: String?, updateNickName: Boolean,
                                     avatarFile: File?, updateAvatar: Boolean)

现在,根据方法中的每个 bool(boolean) 值,我确定是否要更新电子邮件,昵称或头像。 Earleir是通过if条件和单独的API调用实现的。有没有一种方法可以使用提供的标志压缩或合并 call ?

最佳答案

您可以以阻塞的方式实现它:

    fun updateDetails(emailAddress: String?, updateEmail: Boolean,
                      nickName: String?, updateNickName: Boolean,
                      avatarFile: File?, updateAvatar: Boolean) {
        if (updateEmail) {
            updateEmail(emailAddress).blockingGet()
        } 

        if (updateNickName) {
            updateNickName(nickName).blockingGet()
        }

        // ...
    }

或者您可以像这样构建链并最终订阅它:
fun updateDetails(emailAddress: String?, updateEmail: Boolean,
                                     nickName: String?, updateNickName: Boolean,
                                     avatarFile: File?, updateAvatar: Boolean) {

        var chain = Completable.complete()

        if (updateEmail) {
            chain = chain.andThen(updateEmail(emailAddress).ignoreElement())
        }

        if (updateNickName) {
            chain = chain.andThen(updateNickName(nickName).ignoreElement())
        }

        // ...

        chain
            .subscribeOn(..)
            .observeOn(..)
            .subscribe()
}

或链接可完成项:
    fun updateDetails(emailAddress: String?, updateEmail: Boolean,
                      nickName: String?, updateNickName: Boolean,
                      avatarFile: File?, updateAvatar: Boolean) {

        Completable.defer {
            if (updateEmail) {
                updateEmail(emailAddress)
                    .ignoreElement()
            } else {
                Completable.complete()
            }
        }
            .andThen(Completable.defer {
                if (updateNickName) {
                    updateNickName(nickName)
                        .ignoreElement()
                } else {
                    Completable.complete()
                }
            })
            // ...
            .subscribeOn(..)
            .observeOn(..)
            .subscribe()
    }

关于kotlin - 基于 bool 值的Rx Java调用Api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55703697/

相关文章:

kotlin - 如何使用 http4k 公开 swagger UI?

Android/Retrofit HAL JSON 支持

android - RxJava 的 RxSwift Variable 或 BehaviourRelay 的内置等效项

android - 访问 token 更新 Dagger 和 Retrofit 时更新请求 header

Android:使用 Fabric、Twitter REST API 和 Retrofit 将图像添加到推文

java - Handler::removeMessages 的 RxJava 模拟

rx-java - 如何在没有 .flatMap 的情况下控制流,这会破坏 react 流,从而阻止 distinctUntilChanged 等运算符在整个流上工作

kotlin - 使用 ktor 将文件上传到 telegram bot api

kotlin - 字符串插值在 Kotlin 中是如何工作的?

android - 单击按钮时 TextView 未更新