我在应用程序中使用了Retrofit个库,我想设置一个60秒的超时. retrofit 有办法做到这一点吗?

我这样设置Retrofit:

RestAdapter restAdapter = new RestAdapter.Builder()
    .setServer(BuildConfig.BASE_URL)
    .setConverter(new GsonConverter(gson))
    .build();

如何设置超时?

推荐答案

可以在底层HTTP客户端上设置超时.如果您没有指定客户端,改型将创建一个具有默认连接和读取超时的客户端.要设置自己的超时,您需要配置自己的客户端并将其提供给RestAdapter.Builder.

一个选项是使用同样来自Square的OkHttp客户端.

1. Add the library dependency

在建造中.gradle,包括这一行:

compile 'com.squareup.okhttp:okhttp:x.x.x'

Where 100 is the desired library version.

2. Set the client

例如,如果要将超时设置为60秒,请在版本2之前的改装和版本3之前的Okhttp(FOR THE NEWER VERSIONS, SEE THE EDITS)中这样做:

public RestAdapter providesRestAdapter(Gson gson) {
    final OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
    okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);

    return new RestAdapter.Builder()
        .setEndpoint(BuildConfig.BASE_URL)
        .setConverter(new GsonConverter(gson))
        .setClient(new OkClient(okHttpClient))
        .build();
}

EDIT 1

对于3.x.x以后的okhttp版本,必须按以下方式设置依赖关系:

compile 'com.squareup.okhttp3:okhttp:x.x.x'

并使用生成器模式设置客户端:

final OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(60, TimeUnit.SECONDS)
        .connectTimeout(60, TimeUnit.SECONDS)
        .build();

更多信息请点击Timeouts


EDIT 2

2.x.x以来的改型版本也使用生成器模式,因此将上面的返回块更改为:

return new Retrofit.Builder()
    .baseUrl(BuildConfig.BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .client(okHttpClient)
    .build();

如果使用类似于我的providesRestAdapter方法的代码,则将方法返回类型更改为Retrofit.

更多信息请点击Retrofit 2 — Upgrade Guide from 1.9


注:如果你的Minsdk版本大于8,你可以使用TimeUnit.MINUTES:

okHttpClient.setReadTimeout(1, TimeUnit.MINUTES);
okHttpClient.setConnectTimeout(1, TimeUnit.MINUTES);

有关单元的更多详细信息,请参见TimeUnit.

Java相关问答推荐

Java FFM,如何将Java对象与C struct 链接起来?

如何让HikariCP指标在NewRelic中正确显示?

虚拟线程似乎在外部服务调用时阻止运营商线程

我应该避免在Android中创建类并在运行时编译它们吗?

为什么Java中的两个日期有差异?

转换为Biggram

多个Java线程和TreeMap.put()的非预期行为

无法处理批处理侦听器中的反序列化异常

Hibernate EmptyInterceptor可以工作,但不能拦截器

由于我在Main方法中关闭了 scanner ,但在该方法中创建了一个新的 scanner ,因此出现了错误

在Spring Boot应用程序中导致";MediaTypeNotSupportdException&qot;的映像上载

第二次按下按钮后,我需要将按钮恢复到其原始状态,以便它可以再次工作

无法使用Java&;TestContainers获取AWS SQS队列的属性

如何在Cosmos DB(Java SDK)中增加默认响应大小

在Frege中,我如何将一个字符串安全地转换为一个可能的Int?

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

IntelliJ IDEA依赖项工具窗口丢失

Spring Validator批注不起作用

Bash数组的单引号元素并使用空格连接

多线程、并发和睡眠未按预期工作