Retrofit2 SocketTimeOutException [英] Retrofit2 SocketTimeOutException

查看:891
本文介绍了Retrofit2 SocketTimeOutException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为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;
        }
    };

我用来设置缓存:

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

有时服务器响应时间过长,我的应用程序由于SocketTimeOut

Sometime when server response too long My Application crash because SocketTimeOut

它在以下地方中断:Response response = chain.proceed(request);. SocketTimeOutIOException的子类,为什么我的代码无法捕获它. 我该如何解决这个问题.

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.

推荐答案

使用OkHttpClient进行更多配置,例如follwing:

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();

,然后将此okHttpClient设置为RetrofitBuilder

Retrofit.Builder()
    .client(okHttpClient);

这篇关于Retrofit2 SocketTimeOutException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆