RxJava 结合 Single 和 Completable
RxJava combine Single with Completable
我很困惑如何正确使用 Single 和 Completable。
我有一个 returns Single 的 get 方法,另一个方法只是保存数据而 return 什么都没有( 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:
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(...)
,因为您正在将 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)
}
)
}
我很困惑如何正确使用 Single 和 Completable。
我有一个 returns Single 的 get 方法,另一个方法只是保存数据而 return 什么都没有( 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:
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(...)
,因为您正在将 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)
}
)
}