J'utilise une personnalité Interceptor
avec le client de modernisation dans mon Android application, qui jette une exception dans des circonstances spécifiques. J'essaie de le faire fonctionner à l'aide de Kotlin Coroutines .
Le problème est que je ne parviens pas à gérer l'erreur précédemment mentionnée, car au moment où l'exception est lancée à partir de l'instance d'intercepteur, elle bloque toute l'application au lieu d'être prise dans la COROUTINE try/catch
déclaration. Pendant que j'utilisais la mise en œuvre RX, l'exception était parfaitement propagée au rappel onError
où j'ai pu gérer la façon dont j'avais besoin.
Je suppose que cela est en quelque sorte lié aux threads sous-jacents utilisés pour l'appel réseau, veuillez consulter les journaux ci-dessous de l'endroit où l'appel est effectué, de l'intercepteur juste avant de jeter l'exception et de la standingTrace:
2019-11-04 17:17:34.515 29549-29729/com.app W/TAG: Running thread: DefaultDispatcher-worker-1
2019-11-04 17:17:45.911 29549-29834/com.app W/TAG: Interceptor thread: OkHttp https://some.endpoint.com/...
2019-11-04 17:17:45.917 29549-29834/com.app E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
Process: com.app, PID: 29549
com.app.IllegalStateException: Passed refresh token can\'t be used for refreshing the token.
at com.app.net.AuthInterceptor.intercept(AuthInterceptor.kt:33)
Qu'est-ce que je suis censé faire pour pouvoir attraper et gérer cette exception de l'intercepteur correctement? Est-ce que je manque quelque chose?
Je ne sais pas ce que vous avez besoin exactement, mais compris comme ça:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
okhttp3.Response response = chain.proceed(request);
// todo deal with the issues the way you need to
if (response.code() == SomeCode) {
//do something
return response;
}
return response;
}
})
.build();
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(url)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.build();