Android 改装2:如何设置特定请求的单独超时?
我已通过执行以下操作在改装适配器中设置了全局超时Android 改装2:如何设置特定请求的单独超时?,android,retrofit,okhttp,retrofit2,okhttp3,Android,Retrofit,Okhttp,Retrofit2,Okhttp3,我已通过执行以下操作在改装适配器中设置了全局超时 OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(20, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(20, TimeUnit.SECONDS); retrofit = new Retrofit.Builder() .client(okHttpClient) .build(); 太好了!
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(20, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(20, TimeUnit.SECONDS);
retrofit = new Retrofit.Builder()
.client(okHttpClient)
.build();
太好了!但是我想为某些请求设置一个特定的超时
例如
公共接口MyAPI{
@得到()
调用notImportant(@Url字符串Url);
@得到
调用veryiimportant(@Url字符串Url);
因此,veryImportant
调用我希望超时35秒,但notImportant
默认值
这可能吗
我的研究失败了
然而,我遇到了这个问题,但不确定它是否能在改造中起作用
感谢您的阅读。请提供帮助。您可以通过创建改造对象工厂方法的重载方法来实现这一点。它可能是这样的
public class RestClient {
public static final int DEFAULT_TIMEOUT = 20;
public static <S> S createService(Class<S> serviceClass) {
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
OkHttpClient client = httpClient.build();
okHttpClient.setReadTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.client(client)
.build();
return retrofit.create(serviceClass);
}
public static <S> S createService(Class<S> serviceClass, int timeout) {
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
OkHttpClient client = httpClient.build();
okHttpClient.setReadTimeout(timeout, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(timeout, TimeUnit.SECONDS);
Retrofit retrofit = new Retrofit.Builder().baseUrl(APIConfig.BASE_URL)
.client(client)
.build();
return retrofit.create(serviceClass);
}
}
MyAPI api = RestClient.createService(MyAPI.class);
api.notImportant();
如果要通过身份验证调用api,请使用第二个:
int timeout = 35;
MyAPI api2 = RestClient.createService(MYAPI.class, timeout);
api2.veryImportant();
另一个解决方案是使用不同的OkHttpClient配置创建不同的方法,而不是创建重载方法。希望此解决方案能够解决您的问题。请检查此项
如果您使用的是编译'com.squareup.reformation:reformation:1.9.0'
,那么使用下面给出的相同squareup库中的okhttp
compile 'com.squareup.okhttp:okhttp:2.7.2'
这是我的示例代码
final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setClient(new OkClient(okHttpClient))
.build();
注意:60-改装将等待60秒显示超时
final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setClient(new OkClient(okHttpClient))
.build();