如何在改造库中设置超时?

新手上路,请多包涵

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

我这样设置改造:

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

如何设置超时?

原文由 androidevil 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 692
2 个回答

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

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

1.添加库依赖

在 build.gradle 中,包含以下行:

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

其中 x.x.x 是所需的库版本。

2.设置客户端

例如,如果您想设置 60 秒的超时,请在版本 2 之前的 Retrofit 和版本 3 之前的 Okhttp 执行此操作(对于 较新的版本,请参阅编辑):

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


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

超时 中的更多信息


编辑 2

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

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

如果使用像我的 providesRestAdapter 方法这样的代码,则将方法返回类型更改为 Retrofit

Retrofit 2 中的更多信息 — 从 1.9 开始的升级指南


ps:如果你的minSdkVersion大于8,可以使用 TimeUnit.MINUTES

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

有关单位的更多详细信息,请参阅 TimeUnit

原文由 androidevil 发布,翻译遵循 CC BY-SA 4.0 许可协议

这些答案对我来说已经过时了,所以结果是这样的。

添加 OkHttp,在我的例子中版本是 3.3.1

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

然后在构建 Retrofit 之前,执行以下操作:

 OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
    .connectTimeout(60, TimeUnit.SECONDS)
    .readTimeout(60, TimeUnit.SECONDS)
    .writeTimeout(60, TimeUnit.SECONDS)
    .build();
return new Retrofit.Builder()
    .baseUrl(baseUrl)
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

原文由 Teo Inke 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题