我对如何正确使用Single和Completable感到困惑。
我有一个get方法,它返回Single,另一个方法只是保存数据,什么也不返回(Completable)
代码如下:

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 块中编写代码? (或者是否有其他操作员适合该用例?)
谢谢

最佳答案

您可以使用flatMapCompletable:

fun initialize() {
    getUserInfo()
        .flatMapCompletable { userInfo: UserInfo ->
            // save userInfo somewhere. i.e:
            [email protected] = 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(...),因为您是将single转换为completable。

另外,如果您想将userInfo保留为局部变量,则可以从toSingleDefault(...)方法完成的可填充操作执行完毕后,使用save(...)向下游发出它:
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)
            }
        )
}

关于android - RxJava将Single与Completable相结合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59674590/

10-09 07:29