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();
    }
}

总结

修改后异常消失。超时时间、等待时间、线程数量可根据项目实际需求进行调整。

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