OkHttp 라이브러리를 사용하여 앱을 개발 중이며 문제는 연결 시간 초과 및 소켓 시간 초과를 설정하는 방법을 찾을 수 없다는 것입니다.
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
OkHttp 라이브러리를 사용하여 앱을 개발 중이며 문제는 연결 시간 초과 및 소켓 시간 초과를 설정하는 방법을 찾을 수 없다는 것입니다.
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
답변:
당신은 단순히 이것을해야합니다
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
에서 내부 OkHttp
Connection
클래스입니다.
에 시간 초과를 설정하지 않으면 on 또는 OkHttpClient
값을 설정하는 것과 같 으며 시간 초과가 전혀 발생하지 않습니다. 설명은 여기 에서 찾을 수 있습니다 .0
setConnectTimeout
setReadTimeout
주석에서 @marceloquinta가 언급 한 것처럼 setWriteTimeout
설정할 수도 있습니다.
버전 2.5.0부터 @ChristerNordvik에서 언급 한대로 읽기 / 쓰기 / 연결 시간 초과 값은 기본적으로 10 초로 설정되어 있습니다. 이것은 여기에서 볼 수 있습니다 .
OkHttp3 기준으로 지금 통해이 작업을 수행 할 수 있습니다 빌더 과 같이
client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
여기 에서 레시피를 볼 수도 있습니다 .
okhttp3의 경우 약간 변경되었습니다.
이제 다음과 같이 세터가 아닌 빌더를 사용하여 시간을 설정하십시오.
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
자세한 정보는 Wiki에서 확인할 수 있습니다 : https://github.com/square/okhttp/blob/b3dcb9b1871325248fba917458658628c44ce8a3/docs/recipes.md#timeouts-kt-java
Retrofit retrofit : 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();
Retrofit 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();
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();
}
version 3.12.0
에서 okhttp에 새로운 API를 추가 했습니다. 다음과 같이 시간 초과를 설정할 수 있습니다.
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(Duration.ofSeconds(5))/*timeout: 5 seconds*/
.build();
참고 : API 26 이상이 필요하므로 이전 버전의 Android를 지원하는 경우 계속 사용하십시오 (5, TimeUnit.SECONDS)
.
이렇게 :
//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();
이것은 나를 위해 일했다 ... 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 작성 방법을 사용하고 그 위에 빌더를 추가하십시오.
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);
}