J'utilise retorift
pour frapper getAricle
api et obtenir la liste des articles liés à l'utilisateur. getArticle
api lancera erreur si jeton passé est expiré si oui je dois appeler refreshToken
api pour obtenir un nouveau jeton puis de nouveau je dois appeler le getArticle
apiRxJava: Exécuter les secondes observables seulement si le premier jette une erreur et répéter de la première
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)
})
Modifier
Même si les réponses données a montré une certaine direction, mais ceux-ci ne sont pas une réponse directe à ma question. Voici comment résoudre mais je pense que ce peut être refactorisé dans beaucoup meilleur code
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)
}
EDIT
Je refactorisé mon code à un peu plus de version plus propre
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)
}
EDIT
S'il vous plaît vérifier ma réponse pour le code refactorisé final
Tout d'abord, l'adaptation ultérieure, vous pouvez éviter d'aller directement à 'onError'. Vous pouvez retourner 'Single>' qui ne retourne jamais d'erreur. Mais si vous voulez continuer à obtenir 'onError', essayez d'utiliser les opérateurs de gestion des erreurs de RxJava [ici] (https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators) –
masp
@masp Dans le scénario I Je n'arrive pas à comprendre comment rappeler l'api getArticle. Pouvez-vous s'il vous plaît me montrer comment faire cela – Praveen
Avez-vous pu résoudre votre problème? Certaines réponses ont-elles été utiles? Si c'est le cas, pensez à enrichir les réponses utiles et si l'une d'entre elles vous a conduit à une solution, acceptez cette réponse. – theFunkyEngineer