android - Retrofit2 SocketTimeOutException

标签 android retrofit2 socket-timeout-exception

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

它在线中断:Response response = chain.proceed(request); 正如我评论的那样。 SocketTimeOutIOException 的子类,为什么我的代码无法捕获它。 我该如何解决这个问题。

最佳答案

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

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

然后用RetrofitBuilder设置这个okHttpClient,

Retrofit.Builder()
    .client(okHttpClient);

关于android - Retrofit2 SocketTimeOutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785086/

相关文章:

android - OpenSSL 1.0.2 读取 md5 CA 证书

android - Retrofit 2 Spinner 获取数据失败

android - 电话间隙 : Timeout error calling webviewclient

android - 无法连接到 Android 10 中的 HTTP URL

android - 从 Android Activity 中拍照 "as a Service"

java - 如何制作一个列表,每次在 Android Studio 中输入号码并按“提交”时都会添加电话号码?

android - 是否可以从 Assets 文件中获取最后修改日期?

android - 如何进行 API 调用。我是初学者

java - Android Retrofit 2 发布请求响应以及响应类名称

java - 如何以良好的 Java 方式处理由 Exception 引起的问题