如何在Retrofit库中设置超时?

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

我这样设置Retrofit:

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

我怎样才能设置超时?

您可以在基础的HTTP客户端上设置超时。 如果您不指定客户端,那么Retrofit将创build一个默认连接和读取超时。 要设置您自己的超时,您需要configuration您自己的客户端并将其提供给RestAdapter.Builder

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

1.添加库依赖项

在build.gradle中,包含这一行:

 compile 'com.squareup.okhttp:okhttp:xxx' 

其中xxx是所需的库版本。

2.设置客户端

例如,如果要将超时设置为60秒,请在版本2之前对此进行修改,并在版本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.xx以来的okhttp版本,你必须这样设置依赖关系:

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

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

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

更多信息在超时


编辑2

2.xx以来的改进版本也使用了构build器模式,因此将上面的返回块更改为:

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

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

更新信息在改进2 – 从1.9升级指南


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

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

有关单位的更多细节,请参阅TimeUnit 。

这些答案对我来说已经过时了,所以这是如何解决的。

添加OkHttp,在我的情况下,版本是3.3.1

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

然后在build立你的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(); 

我正在使用Retrofit 1.9来获取XML

 public class ServicioConexionRetrofitXML { public static final String API_BASE_URL = new GestorPreferencias().getPreferencias().getHost(); public static final long tiempoMaximoRespuestaSegundos = 60; public static final long tiempoMaximoLecturaSegundos = 100; public static final OkHttpClient clienteOkHttp = new OkHttpClient(); private static RestAdapter.Builder builder = new RestAdapter.Builder(). setEndpoint(API_BASE_URL). setClient(new OkClient(clienteOkHttp)).setConverter(new SimpleXMLConverter()); public static <S> S createService(Class<S> serviceClass) { clienteOkHttp.setConnectTimeout(tiempoMaximoRespuestaSegundos, TimeUnit.SECONDS); clienteOkHttp.setReadTimeout(tiempoMaximoLecturaSegundos, TimeUnit.SECONDS); RestAdapter adapter = builder.build(); return adapter.create(serviceClass); } } 

如果您正在使用Retrofit 1.9.0和okhttp 2.6.0,请添加到您的Gradle文件。

  compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'com.squareup.okhttp:okhttp:2.6.0' // Librería de retrofit para XML converter (Simple) Se excluyen grupos para que no entre // en conflicto. compile('com.squareup.retrofit:converter-simplexml:1.9.0') { exclude group: 'xpp3', module: 'xpp3' exclude group: 'stax', module: 'stax-api' exclude group: 'stax', module: 'stax' } 

注意:如果您需要获取JSON ,只需从上面的代码中删除。

 .setConverter(new SimpleXMLConverter()) 
 public class ApiModule { public WebService apiService(Context context) { String mBaseUrl = context.getString(BuildConfig.DEBUG ? R.string.local_url : R.string.live_url); HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE); OkHttpClient okHttpClient = new OkHttpClient.Builder() .readTimeout(120, TimeUnit.SECONDS) .writeTimeout(120, TimeUnit.SECONDS) .connectTimeout(120, TimeUnit.SECONDS) .addInterceptor(loggingInterceptor) //.addNetworkInterceptor(networkInterceptor) .build(); return new Retrofit.Builder().baseUrl(mBaseUrl) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build().create(WebService.class); } }