【问题标题】:Setting custom connection timeout in retrofit not working在改造中设置自定义连接超时不起作用
【发布时间】:2019-06-26 16:48:58
【问题描述】:

改造不采用自定义超时,连接超时默认需要 10 秒。

我已经尝试了所有设置自定义超时的方法,如下面的代码。

//service generator class
    public class ServiceGenerator{

    private Context context;

    private static OkHttpClient.Builder httpClient =new OkHttpClient.Builder();

     private static Retrofit.Builder builder =
                    new Retrofit.Builder()
                            .baseUrl(UriList.BASE_URL)
                            .client(getRequestHeader())
                          .addConverterFactory(GsonConverterFactory.create());

    public static HttpLoggingInterceptor setLogger() {
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        return logging;
    }


    public static <S> S createService(Class<S> serviceClass, Context context) {

        if (!httpClient.interceptors().isEmpty()) {

            httpClient.interceptors().clear();
        }


            httpClient.addInterceptor(new NetworkConnectionInterceptor(context));
            httpClient.addInterceptor(setLogger());
            httpClient.addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request original = chain.request();
                    Request.Builder requestBuilder = original.newBuilder()
    MyApplication.getInstance().getApiCredential())
                            .header("LocalSystemDate", MyApplication.getInstance().getCurrentDateAndTimeWithTimeZone())
                            .method(original.method(), original.body());
                    Request request = requestBuilder.build();
                    return chain.proceed(request);
                }
            });

        OkHttpClient client = httpClient.build();
        Retrofit retrofit = builder.client(client).build();
        return retrofit.create(serviceClass);
    }


    private static OkHttpClient getRequestHeader() {

        return new OkHttpClient.Builder()
                .readTimeout(2, TimeUnit.MINUTES)
                .connectTimeout(2, TimeUnit.MINUTES)
                .writeTimeout(2, TimeUnit.MINUTES)
                .build();
    }


}

10 秒后出现错误:

D/OkHttp: <-- HTTP FAILED: java.net.SocketTimeoutException

【问题讨论】:

  • 可以添加调用方法吗?
  • @RajasekaranM 调用方法:Service service = ServiceGenerator.createService(Service.class, context);调用> opSearchResults = service.getOpSearchResults();
  • 可以更新ServiceGenerator完整代码吗?
  • @RajasekaranM 嗨,我已经更新了完整代码
  • 我已经通过在创建服务类中调用连接超时来解决这个问题 :) ..... httpClient.addInterceptor(new NetworkConnectionInterceptor(context)); httpClient.addInterceptor(setLogger()); httpClient.connectTimeout(1,TimeUnit.MINUTES); httpClient.readTimeout(1,TimeUnit.MINUTES); httpClient.writeTimeout(1,TimeUnit.MINUTES); httpClient.addInterceptor(new Interceptor() ....

标签: android retrofit2 okhttp


【解决方案1】:

你在创建改造对象时使用了错误的httpclient

您必须在createService(Class&lt;S&gt; serviceClass, Context context) 中添加以下代码行

 httpClient.readTimeout(2, TimeUnit.MINUTES)
           .connectTimeout(2, TimeUnit.MINUTES)
           .writeTimeout(2, TimeUnit.MINUTES);

所以你的createService(Class&lt;S&gt; serviceClass, Context context) 会是

public static <S> S createService(Class<S> serviceClass, Context context) {

            if (!httpClient.interceptors().isEmpty()) {

                httpClient.interceptors().clear();
            }


            httpClient.addInterceptor(new NetworkConnectionInterceptor(context));
            httpClient.addInterceptor(setLogger());
            httpClient.readTimeout(2, TimeUnit.MINUTES)
                    .connectTimeout(2, TimeUnit.MINUTES)
                    .writeTimeout(2, TimeUnit.MINUTES);
            httpClient.addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request original = chain.request();
                    Request.Builder requestBuilder = original.newBuilder()
                    MyApplication.getInstance().getApiCredential())
                            .header("LocalSystemDate", MyApplication.getInstance().getCurrentDateAndTimeWithTimeZone())
                            .method(original.method(), original.body());
                    Request request = requestBuilder.build();
                    return chain.proceed(request);
                }
            });

            OkHttpClient client = httpClient.build();
            Retrofit retrofit = builder.client(client).build();
            return retrofit.create(serviceClass);
        }

现在可以使用了。试试看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2021-04-29
    • 2019-07-22
    • 1970-01-01
    相关资源
    最近更新 更多