Как установить время ожидания соединения с OkHttp
Я разрабатываю приложение с помощью библиотеки OkHttp, и моя проблема заключается в том, что я не могу найти, как установить тайм-аут соединения и тайм-аут сокета.
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
спасибо.
10 ответов:
вы просто должны сделать это
OkHttpClient client = new OkHttpClient(); client.setConnectTimeout(15, TimeUnit.SECONDS); // connect timeout client.setReadTimeout(15, TimeUnit.SECONDS); // socket timeout Request request = new Request.Builder().url(url).build(); Response response = client.newCall(request).execute();имейте в виду, что значение, установленное в
setReadTimeoutиспользуетсяsetSoTimeoutнаSocketвнутриOkHttpConnectionкласса.не устанавливая тайм-аут на
OkHttpClientявляется эквивалентом установки значения0onsetConnectTimeoutилиsetReadTimeoutи не приведет к таймауту вообще. Описание можно найти здесь.как упоминалось @marceloquinta в комментариях
setWriteTimeoutтакже может быть установлен.начиная с версии 2.5.0 значения таймаута чтения / записи / подключения по умолчанию устанавливаются в 10 секунд, как указано в @ChristerNordvik. Это видно здесь.
по состоянию на Охттп3 теперь можно сделать это через Строитель вот так
client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .build();вы также можете просмотреть рецепт здесь
для охттп3 это немного изменилось.
теперь вы устанавливаете время с помощью конструктора, а не сеттеров, как это:
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .build();дополнительную информацию можно найти в их Вики: https://github.com/square/okhttp/wiki/Recipes#timeouts
для дооснащения дооснащение: 2.0.0-beta4 код выглядит следующим образом
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(logging) .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://api.yourapp.com/") .addConverterFactory(GsonConverterFactory.create()) .client(client) .build();
для модификации 2.0.0-beta1 или beta2 код выглядит следующим образом
OkHttpClient client = new OkHttpClient(); client.setConnectTimeout(30, TimeUnit.SECONDS); client.setReadTimeout(30, TimeUnit.SECONDS); client.setWriteTimeout(30, TimeUnit.SECONDS); Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://api.yourapp.com/") .addConverterFactory(GsonConverterFactory.create()) .client(client) .build();
//add in gradle and sync compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.google.code.gson:gson:2.6.2' import okhttp3.OkHttpClient; import okhttp3.OkHttpClient.Builder; Builder b = new Builder(); b.readTimeout(200, TimeUnit.MILLISECONDS); b.writeTimeout(600, TimeUnit.MILLISECONDS); // set other properties OkHttpClient client = b.build();
вот так:
//New Request HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BASIC); final OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(logging) .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .build();
Теперь все изменилось. Заменить
.Builder()С.newBuilder()по состоянию на okhttp:3.9.0 код выглядит следующим образом:
OkHttpClient okHttpClient = new OkHttpClient() .newBuilder() .connectTimeout(10,TimeUnit.SECONDS) .writeTimeout(10,TimeUnit.SECONDS) .readTimeout(30,TimeUnit.SECONDS) .build();
это сработало для меня ... от https://github.com/square/okhttp/issues/3553
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .retryOnConnectionFailure(false) <-- not necessary but useful! .build();
Если вы хотите настроить конфигурацию, то используйте приведенную ниже методику создания OKhttpclient, а затем добавьте builder поверх него.
private final OkHttpClient client = new OkHttpClient(); // Copy to customize OkHttp for this request. OkHttpClient client1 = client.newBuilder() .readTimeout(500, TimeUnit.MILLISECONDS) .build(); try (Response response = client1.newCall(request).execute()) { System.out.println("Response 1 succeeded: " + response); } catch (IOException e) { System.out.println("Response 1 failed: " + e); }
okhttp версия:
3.11.0или вышеиз источника okhttp код
/** * Sets the default connect timeout for new connections. A value of 0 means no timeout, * otherwise values must be between 1 and {@link Integer#MAX_VALUE} when converted to * milliseconds. * * <p>The connectTimeout is applied when connecting a TCP socket to the target host. * The default value is 10 seconds. */ public Builder connectTimeout(long timeout, TimeUnit unit) { connectTimeout = checkDuration("timeout", timeout, unit); return this; }
unitможет быть любое значение нижеTimeUnit.NANOSECONDS TimeUnit.MICROSECONDS TimeUnit.MILLISECONDS TimeUnit.SECONDS TimeUnit.MINUTES TimeUnit.HOURS TimeUnit.DAYSпример кода
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(5000, TimeUnit.MILLISECONDS)/*timeout: 5 seconds*/ .build(); String url = "https://www.google.com"; Request request = new Request.Builder() .url(url) .build(); try { Response response = client.newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); }
Comments