【发布时间】:2019-06-26 16:48:58
【问题描述】:
改造不采用自定义超时,连接超时默认需要 10 秒。
我已经尝试了所有设置自定义超时的方法,如下面的代码。
//service generator class
public class ServiceGenerator{
private Context context;
private static OkHttpClient.Builder httpClient =new OkHttpClient.Builder();
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(UriList.BASE_URL)
.client(getRequestHeader())
.addConverterFactory(GsonConverterFactory.create());
public static HttpLoggingInterceptor setLogger() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
return logging;
}
public static <S> S createService(Class<S> serviceClass, Context context) {
if (!httpClient.interceptors().isEmpty()) {
httpClient.interceptors().clear();
}
httpClient.addInterceptor(new NetworkConnectionInterceptor(context));
httpClient.addInterceptor(setLogger());
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder()
MyApplication.getInstance().getApiCredential())
.header("LocalSystemDate", MyApplication.getInstance().getCurrentDateAndTimeWithTimeZone())
.method(original.method(), original.body());
Request request = requestBuilder.build();
return chain.proceed(request);
}
});
OkHttpClient client = httpClient.build();
Retrofit retrofit = builder.client(client).build();
return retrofit.create(serviceClass);
}
private static OkHttpClient getRequestHeader() {
return new OkHttpClient.Builder()
.readTimeout(2, TimeUnit.MINUTES)
.connectTimeout(2, TimeUnit.MINUTES)
.writeTimeout(2, TimeUnit.MINUTES)
.build();
}
}
10 秒后出现错误:
D/OkHttp: <-- HTTP FAILED: java.net.SocketTimeoutException
【问题讨论】:
-
可以添加调用方法吗?
-
@RajasekaranM 调用方法:Service service = ServiceGenerator.createService(Service.class, context);调用
- > opSearchResults = service.getOpSearchResults();
-
可以更新ServiceGenerator完整代码吗?
-
@RajasekaranM 嗨,我已经更新了完整代码
-
我已经通过在创建服务类中调用连接超时来解决这个问题 :) ..... httpClient.addInterceptor(new NetworkConnectionInterceptor(context)); httpClient.addInterceptor(setLogger()); httpClient.connectTimeout(1,TimeUnit.MINUTES); httpClient.readTimeout(1,TimeUnit.MINUTES); httpClient.writeTimeout(1,TimeUnit.MINUTES); httpClient.addInterceptor(new Interceptor() ....