通过多个同时网络调用获取套接字超时异常
Getting socket timeout exception with multiple simultaneous network calls
我需要在屏幕上同时进行多个 api 调用。我注意到一个奇怪的问题。当我得到一个 api 调用的套接字超时异常时,其他并行调用也得到相同的异常。如果我测试其他电话,它们工作正常。不确定确切的问题是什么。这是我的代码。
// getting ok http client
private static OkHttpClient getUnsafeOkHttpClient() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
// Remove cookies from the request
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
cookieManager.getCookieStore().removeAll();
try {
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
OkHttpClient client;
client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory())
.addInterceptor(interceptor)
.cookieJar(new JavaNetCookieJar(cookieManager))
.connectTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS) // set the request timeout
.readTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS)
.hostnameVerifier((hostname, session) -> true)
.build();
client.dispatcher().setMaxRequestsPerHost(20);
client.dispatcher().setMaxRequests(20);
return client;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// making api call
public static void makeNetworkRequest(Call<JSONObject> requestCall, final NetworkListener networkListener){
// define the request callback object
Callback<JSONObject> requestCallback = new Callback<JSONObject>() {
@Override
public void onResponse(Call<JSONObject> call, Response<JSONObject> response) {
networkListener.onSuccess(response);
}
@Override
public void onFailure(Call<JSONObject> call, Throwable t) {
t.printStackTrace();
networkListener.onFailure(CONN_FAILED);
}
};
// make the request
requestCall.enqueue(requestCallback);
}
有人可以帮我解决这个问题吗?
我已经确定问题所在,我将 Retrofit 客户端对象定义为单例。如果我为每次调用创建实例,它工作正常。
我需要在屏幕上同时进行多个 api 调用。我注意到一个奇怪的问题。当我得到一个 api 调用的套接字超时异常时,其他并行调用也得到相同的异常。如果我测试其他电话,它们工作正常。不确定确切的问题是什么。这是我的代码。
// getting ok http client
private static OkHttpClient getUnsafeOkHttpClient() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
// Remove cookies from the request
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
cookieManager.getCookieStore().removeAll();
try {
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
OkHttpClient client;
client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory())
.addInterceptor(interceptor)
.cookieJar(new JavaNetCookieJar(cookieManager))
.connectTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS) // set the request timeout
.readTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS)
.hostnameVerifier((hostname, session) -> true)
.build();
client.dispatcher().setMaxRequestsPerHost(20);
client.dispatcher().setMaxRequests(20);
return client;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// making api call
public static void makeNetworkRequest(Call<JSONObject> requestCall, final NetworkListener networkListener){
// define the request callback object
Callback<JSONObject> requestCallback = new Callback<JSONObject>() {
@Override
public void onResponse(Call<JSONObject> call, Response<JSONObject> response) {
networkListener.onSuccess(response);
}
@Override
public void onFailure(Call<JSONObject> call, Throwable t) {
t.printStackTrace();
networkListener.onFailure(CONN_FAILED);
}
};
// make the request
requestCall.enqueue(requestCallback);
}
有人可以帮我解决这个问题吗?
我已经确定问题所在,我将 Retrofit 客户端对象定义为单例。如果我为每次调用创建实例,它工作正常。