【问题标题】:RxJava combine Single with CompletableRxJava 结合 Single 和 Completable
【发布时间】:2020-01-10 02:01:13
【问题描述】:

我很困惑如何正确使用 Single 和 Completable。
我有一个返回 Single 的 get 方法,而另一种方法只是保存数据并且什么都不返回(可完成)
代码如下所示:

fun getUserInfo() : Single<UserInfo>

fun save(token: Token) : Completable

fun initialize() {
    getUserInfo()
        .flatMap { 
            // Get token from UserInfo : val token = userInfor.getToken()
            // Call save(token: Token) method to save data
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeBy(
            onSuccess = {
                // HERE:  Using UserInfo to do somtehing
            },
            onError = {
                Log.d(it)
            }
        )
}  

如何在 flatMap 块内编写代码? (或者是否有其他适合此用例的运算符?)
谢谢你

【问题讨论】:

    标签: android kotlin rx-java rx-java2


    【解决方案1】:

    你可以使用flatMapCompletable:

    fun initialize() {
        getUserInfo()
            .flatMapCompletable { userInfo: UserInfo ->
                // save userInfo somewhere. i.e:
                this@MyActivity.userInfo = userInfo
                val token = userInfo.getToken()
                return@flatMapCompletable save(token) 
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeBy(
                onComplete = { // <--------- this becomes onComplete instead of onSuccess
                    // Here, you can use userInfo that you saved
                },
                onError = {
                    Log.d(it)
                }
            )
    }  
    

    请注意,在您的 subscribeBy(...) 方法中,不要忘记将回调函数名称从 onSuccess(...) 更改为 onComplete(...),因为您正在将单个转换为可完成。

    或者,如果您想将userInfo 保留为局部变量,则可以在您的save(...) 方法中的可完成执行完成后使用toSingleDefault(...) 将其发送到下游:

    fun initialize() {
        getUserInfo()
            .flatMap { userInfo: UserInfo -> // change back to flatmap
                val token = userInfo.getToken()
                return@flatMap save(token).toSingleDefault(userInfo) 
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeBy(
                onSuccess = { userInfo: UserInfo ->
                    // do something with userInfo ...
                },
                onError = {
                    Log.d(it)
                }
            )
    } 
    

    【讨论】:

    • 是的。 toSingleDefault 救了我一命~
    • @buzaa 很高兴为您提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多