背景介绍
项目中开启线程池下载图片,okhttp报错如下:
一直沿用以前开发的工具类(将okhttp客户端封装成了单例模式),之前开发的项目涉及到的网络请求未出现过类似异常,而这次由于图片下载量大,线程数量多,造成socket超时。
之前的工具类:
public class OkHttpUtils {
private static volatile OkHttpClient okHttpClient;
private OkHttpUtils(){
}
public static OkHttpClient getInstance(){
if (null==okHttpClient){
synchronized (OkHttpUtils.class){
if (okHttpClient==null){
okHttpClient = new OkHttpClient();
return okHttpClient;
}
}
}
return okHttpClient;
}
}
可见未设置超时连接,超时读取,重连等属性。
代码修改
设置超时、重连、及池化连接。由于项目中下载任务较多,且线程池中核心线程数量设置为12,最大线程数量设置为24,这里为保险起见,okhttp连接池最大空闲数量设为32,防止无连接可用抛出异常:
public class OkHttpUtils {
private static volatile OkHttpClient okHttpClient;
private OkHttpUtils(){
}
public static OkHttpClient getInstance(){
if (null == okHttpClient){
synchronized (OkHttpUtils.class){
if (okHttpClient==null){
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.readTimeout(60, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(32,5L, TimeUnit.SECONDS))
.build();
return okHttpClient;
}
}
}
return okHttpClient.newBuilder().build();
}
}
总结
修改后异常消失。超时时间、等待时间、线程数量可根据项目实际需求进行调整。