okhttp3 java.net.SocketTimeoutException: timeout 異常處理

背景介紹

    項目中開啓線程池下載圖片,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();
    }
}

總結

修改後異常消失。超時時間、等待時間、線程數量可根據項目實際需求進行調整。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章