在request中利用tag带上具体的超时参数,之后在超时拦截器处理。
单例请求client:
public class RequestClient {
private static volatile OkHttpClient instance;
private RequestClient() {
}
public static OkHttpClient getInstance() {
if (Objects.isNull(instance)) {
synchronized (RequestClient.class) {
if (Objects.isNull(instance)) {
instance = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.connectTimeout(10000, TimeUnit.SECONDS) //连接超时
.readTimeout(10000, TimeUnit.SECONDS) //读取超时
.writeTimeout(10000, TimeUnit.SECONDS) //写超时
.addInterceptor(new TimeOutInterceptor())
.build();
}
}
}
return instance;
}
}
TimeOutConfig:
public class TimeOutConfig {
public Integer socketConnectionTime;
public TimeOutConfig(Integer socketConnectionTime) {
this.socketConnectionTime = socketConnectionTime;
}
}
超时拦截器:
public class TimeOutInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
TimeOutConfig tag = (TimeOutConfig) request.tag(TimeOutConfig.class);
if (Objects.nonNull(tag)) {
return chain.withConnectTimeout(tag.socketConnectionTime, TimeUnit.MILLISECONDS)
.proceed(request);
}
return chain.proceed(request);
}
}
demo:
public class RequestDemo {
public static void main(String[] args) {
OkHttpClient client = RequestClient.getInstance();
TimeOutConfig timeOutConfig = new TimeOutConfig(1);
Request request = new Request.Builder()
.url("https://github.com")
.tag(timeOutConfig)
.build();
Call call = client.newCall(request);
try (Response response = call.execute()) {
if (response.isSuccessful()) {
System.out.println(response.body().string());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
也可以用注解的方式。但实现方式不同。