背景介紹
項目中開啓線程池下載圖片,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();
}
}
總結
修改後異常消失。超時時間、等待時間、線程數量可根據項目實際需求進行調整。