Задание тайм-аута нестандартного соединения не работает - PullRequest
1 голос
/ 26 июня 2019

дооснащение не требует пользовательского тайм-аута, по умолчанию требуется 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

1 Ответ

0 голосов
/ 26 июня 2019

Вы используете неправильный httpclient при создании модифицированного объекта

Вы должны добавить ниже строки кодов внутри createService(Class<S> serviceClass, Context context)

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

Таким образом, ваш createService(Class<S> 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);
        }

Это будет работать сейчас.попробуй.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...