mdtuyen
mdtuyen

Reputation: 4548

Retrofit2 SocketTimeOutException

I setup for Retrofit:

private Interceptor interceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            if (!NetworkUtil.isNetworkAvailable()) {
                request = request.newBuilder()
                        .cacheControl(CacheControl.FORCE_CACHE)
                        .build();
            }
            Response response = chain.proceed(request); //Exception here

            if (NetworkUtil.isNetworkAvailable()) {
                String cacheControl = request.cacheControl().toString();
                response = response.newBuilder()
                        .removeHeader("Pragma")
                        .removeHeader("Cache-Control")
                        .header("Cache-Control", cacheControl)
                        .build();
            } else {
                int maxStale = 60 * 60 * 24 * 7;
                response = response.newBuilder()
                        .removeHeader("Pragma")
                        .removeHeader("Cache-Control")
                        .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                        .build();
            }
            return response;
        }
    };

And I use to setup cache:

builder = new OkHttpClient.Builder()
                    .cookieJar(new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(Apploader.context)))
                    .addNetworkInterceptor(interceptor)
                    .addInterceptor(interceptor)
                    .cache(cache)
                    .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);

Sometime when server response too long My Application crash because SocketTimeOut

It break on line: Response response = chain.proceed(request); as I comment. SocketTimeOut is subclass of IOException, why my code can't catch it. How do I resolved this problem.

Upvotes: 9

Views: 4332

Answers (2)

EKN
EKN

Reputation: 1914

You can use retrofit Callback method to easily handle exception that occurs during retrofit call. It has onResponse() and onFailure() override methods. If the retrofit call is succeeded then onResponse() will trigger, If the call is failure or any exception is occur then onFailure() will trigger.

You can refer below tutorials for a better idea about retrofit call backs

https://www.journaldev.com/13639/retrofit-android-example-tutorial https://www.androidhive.info/2016/05/android-working-with-retrofit-http-library/

Upvotes: 1

user6870367
user6870367

Reputation:

Use OkHttpClient for more configurations, like follwing :

final OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .connectTimeout(20, TimeUnit.SECONDS)
    .writeTimeout(20, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .build();

and then set this okHttpClient with RetrofitBuilder,

Retrofit.Builder()
    .client(okHttpClient);

Upvotes: 4

Related Questions