首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Retrofit2 SocketTimeOutException

Retrofit2 SocketTimeOutException
EN

Stack Overflow用户
提问于 2017-12-13 11:34:07
回答 2查看 2.7K关注 0票数 8

I设置为Retrofit

代码语言:javascript
复制
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;
        }
    };

我用来设置缓存:

代码语言:javascript
复制
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而崩溃

在我注释时,它在行上中断:Response response = chain.proceed(request);SocketTimeOutIOException的子类,为什么我的代码不能捕获它。我该如何解决这个问题。

EN

回答 2

Stack Overflow用户

发布于 2017-12-13 12:45:07

使用OkHttpClient进行更多配置,如下所示:

代码语言:javascript
复制
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .connectTimeout(20, TimeUnit.SECONDS)
    .writeTimeout(20, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .build();

然后用RetrofitBuilder设置这个okHttpClient

代码语言:javascript
复制
Retrofit.Builder()
    .client(okHttpClient);
票数 4
EN

Stack Overflow用户

发布于 2017-12-13 13:16:31

您可以使用改进的回调方法来轻松处理在改进调用过程中发生的异常。它有onResponse()和onFailure()覆盖方法。如果改造调用成功,则将触发onResponse();如果调用失败或发生任何异常,则将触发onFailure()。

您可以参考下面的教程,以获得关于改进回调的更好想法

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47785086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档