如何在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); } }
- 添加标题的所有请求与改造2
- 不支持的操作:Android,Retrofit,OkHttp。 在OkHttpClient中添加拦截器
- Retrofit 2.0如何获得反序列化的错误response.body
- 实施Retrofitcallback重新创build活动的最佳做法?
- Retrofit 2从基本url中删除主机名后面的字符
- javax.net.ssl.SSLException:读取错误:ssl = 0x9524b800:系统调用期间发生I / O错误,由对等方重置连接
- 如何使用Retrofit从asynchronouscallback中返回String或JSONObject?
- 如何在一个Retrofit请求的正文中发布原始的整个JSON?
- (Retrofit)找不到类崩溃应用程序的转换器