I\'m using a android-priority-jobqueue and I use retrofit to make synchronous calls to my rest api but i\'m unsure how to handle errors like 401 Unauthorized errors which I sen
Putting checks for 401 on every response is not a very good approach. Instead one can apply this check at the base level i.e. while creating an object for Retrofit, through the interceptors. Have a look:
public synchronized static Retrofit getClientWithRetry(final Context ctx) {
if (clientWithRetry == null) {
Interceptor responseCodeInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
if (response.code() == 401) {
Log.d(LOG_TAG, "Intercepted Req: " + response.toString());
Response r = retryWithFreshToken(request, chain);
return r;
}
return response;
}
};
int cacheSize = 10 * 1024 * 1024; // 10 MB
Cache cache = new Cache(ctx.getCacheDir(), cacheSize);
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(logging)
.addInterceptor(responseCodeInterceptor)
.cache(cache)
.build();
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client);
clientWithRetry = builder.build();
}
return clientWithRetry;
}
Here internally if a 401 is observed a new chained request can be made and token can be fetched. Post which the original request can be completed. Taken from this Retrofit retry tutorial.