我正在使用retorift
命中getAricle
API并获取与用户相关的文章列表。 getArticle
API将引发错误,如果令牌传递已过期,如果是的话我得叫refreshToken
API来获取新的令牌,有一次我有打电话给getArticle
APIRxJava:只有在第一个抛出错误时重复执行第二个可观察事件,并且从第一个重复执行
ApiController.createRx().getArticle(token)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ response -> toast(response.body().url) }, { e ->
println(e.printStackTrace())
if(e is HttpException && e.code() in arrayOf(401,403)){
//Here I want to call refresh tolken api
toast("Auth error")
}
else
toast(R.string.something_went_wrong)
})
编辑
即使给出答案显示了一些方向,但这些并不是我的问题的直接答案。这是怎么解决的,但我觉得这是可以重构为更好的代码
ApiController.createRx().getArticle(Preference.getToken())
.flatMap { value ->
if (value.code() in arrayOf(403, 401)) {
ApiController.refreshToken()
ApiController.createRx().getArticle(Preference.getToken())
} else Observable.just(value)
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ response -> println("Success") }, { e ->
e.printStackTrace()
toast(R.string.something_went_wrong)
})
fun refreshToken() {
val token:String?=ApiController.createRx().refreshToken(Preferences.getRefreshToken()).blockingFirst()?.body()?.token
if (token != null) Preferences.setAuthToken(token)
}
编辑
我重构我的代码稍微清洁的版本
Observable.defer { ApiController.createRx().getArticle(Preferences.getToken()) }
.flatMap {
if (it.code() in arrayOf(401, 403)) {
ApiController.refreshToken()
Observable.error(Throwable())
} else Observable.just(it)
}
.retry(1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({println("Success") }, {
it.printStackTrace()
toast(R.string.something_went_wrong)
})
fun refreshToken() {
var token: String? = null
try {
token = createRx().refreshToken(Preferences.getRefreshToken()).blockingFirst().body()!!.token
} catch (e: Exception) {
throw e
}
println("saving token")
if (token != null) Preferences.setAuthToken(token)
}
编辑
请检查我的答案为最终重构代码
首先,与改造就可避免直接去'onError'。您可以返回永不返回错误的Single>'。但是如果你想不断得到'onError',尝试使用RxJava的错误处理操作符[here](https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators) –
masp
@masp在场景I我无法理解如何回忆getArticle api。你能告诉我怎么做 – Praveen
你能解决你的问题吗?任何答案是否有帮助?如果是这样,请考虑提供任何有用的答案,如果其中一个引导您找到解决方案,请接受该答案。 – theFunkyEngineer