如何使用OkHttp设置连接超时时间

211

我正在使用OkHttp库开发应用程序,我的问题是我找不到如何设置连接超时和套接字超时。

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder().url(url).build();

Response response = client.newCall(request).execute();

3
您所选择的答案已不再有效。也许您应该编辑问题以指定OkHttp的版本。 - BillHaggerty
11个回答

401
截至目前的OkHttp3版本,您可以通过Builder来实现这一点。
client = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .build();

您也可以在此处查看该食谱。

对于旧版本,您只需执行以下操作

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中设置的值是在OkHttp Connection类内部使用的Socket上使用的值,而不是在setSoTimeout中使用的值。
OkHttpClient上不设置任何超时时间相当于在setConnectTimeoutsetReadTimeout上设置了一个值为0,并且将不会有任何超时。这里可以找到说明。
如@marceloquinta在评论中提到的那样,也可以设置setWriteTimeout
截至版本2.5.0,读取/写入/连接超时时间默认为10秒,正如@ChristerNordvik所提到的。可以在这里看到。

11
每个请求(具有相同的静态客户端)是否有一种方法可以为其设置不同的超时时间? - StErMi
3
你可以为每个请求设置特定的超时时间:以下是相关信息: https://github.com/square/okhttp/wiki/Recipes - Tobliug
3
不要忘记写入超时:client.setWriteTimeout(10, TimeUnit.SECONDS); - marceloquinta
8
FYI,@MiguelLavigne,OkHttp在2.5.0中更改为默认超时时间为10秒。 - Christer Nordvik
7
好的,我会尽力进行翻译。以下是需要翻译的内容:Outdated Answer - devDeejay
显示剩余5条评论

154

我重复使用同一个“客户端”,如何设置每个请求?(因为有些请求比其他请求更重要。) - undefined

12

对于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();

9
对于 Retrofit 2.0.0-beta1beta2,代码如下所示:
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();

7

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();
}

更新

我已经在 OkHttp 版本 3.12.0 中添加了新的API,您可以像这样设置超时时间:

OkHttpClient client = new OkHttpClient.Builder()
    .connectTimeout(Duration.ofSeconds(5)) // timeout: 5 seconds
    .build();

注意:此功能需要API 26+,如果您需要支持较旧版本的Android,请继续使用(5, TimeUnit.SECONDS)


7

在 gradle 文件中添加并 同步项目

compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.google.code.gson:gson:2.6.2'

在Java类中添加:

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();

6

现在已经变了。将.Builder()替换为.newBuilder()

okhttp:3.9.0开始,代码如下所示:

OkHttpClient okHttpClient = new OkHttpClient()
    .newBuilder()
    .connectTimeout(10,TimeUnit.SECONDS)
    .writeTimeout(10,TimeUnit.SECONDS)
    .readTimeout(30,TimeUnit.SECONDS)
    .build();

1
这是不正确的。newBuilder() 的作用是创建一个新的 OkHttpClient 实例,它共享与原始客户端相同的连接池、线程池和基本配置,但可以以不同的方式进行配置。它旨在在为不同的特定目的提供服务时重用相同的共享资源。例如,如果您需要一个具有更短超时时间的不同客户端。最后,没有理由将 new OkHttpClient.Builder() 更改为 new OkHttpClient().newBuilder()。来源:https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html - Mickael Bergeron Néron

4

以下方法适用于我:

OkHttpClient client = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .retryOnConnectionFailure(false) <-- not necessary but useful!
    .build();

来源:https://github.com/square/okhttp/issues/3553

这是一个关于IT技术的问题。

这取决于使用情况。 - GvSharma

4

像这样:

//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();

2

您可以设置呼叫超时时间,以覆盖从解析DNS、连接、编写请求正文、服务器处理和读取响应正文的整个周期。

最初的回答:

val client = OkHttpClient().newBuilder().callTimeout(CALL_TIMEOUT_IN_MINUTES, TimeUnit.MINUTES).build()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接