使用OKHttp上传图片时,发生的超时异常。推测主要是网络的原因,重新设置连接、读超时、及池化连接,将最大空闲数和等待时间设大。多,且线程池中核心线程数量设置为10,最大线程数量设置为24。调用OkHttpUtils.getInstance()获取okhttpClient对象,在并发运行时需保证足够数量的okhttp连接。原来的代码底层用的默认值:连接池最大连接空闲数5,连接超时10秒,读写超时15秒。我们重新定义okhttp连接池最大空闲数量设为32,防止无连接可用等待超时后抛异常

package com.wong.demo;

import android.text.TextUtils;
import com.csair.pda.Global;
import com.csair.pda.PdaApplication;
import java.util.concurrent.TimeUnit;

import okhttp3.Callback;
import okhttp3.ConnectionPool;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;

public class OkHttpUtils {

    private final static int READ_TIMEOUT = 100;

    private final static int CONNECT_TIMEOUT = 60;

    private final static int WRITE_TIMEOUT = 60;

    private static volatile OkHttpClient okHttpClient;

    private OkHttpUtils(){

        okhttp3.OkHttpClient.Builder clientBuilder = new okhttp3.OkHttpClient.Builder();
        //读取超时
        clientBuilder.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS);
        //连接超时
        clientBuilder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);
        //写入超时
        clientBuilder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS);
        //自定义连接池最大空闲连接数和等待时间大小,否则默认最大5个空闲连接
        clientBuilder.connectionPool(new ConnectionPool(32,5,TimeUnit.MINUTES));

        okHttpClient = clientBuilder.build();
    }

    public static OkHttpClient getInstance(){
        if (null == okHttpClient){
            synchronized (OkHttpUtils.class){
                if (okHttpClient == null){
                    new OkHttpUtils();
                    return okHttpClient;
                }
            }
        }
        return okHttpClient;
    }

按上面调整后,效果好了很多。应用这个单例:

 /**
     *
     * @param bytes 待上传文件
     * @param ids 运单的batch_id
     * @param type 1 不正常 2 车辆登记
     */
    public static void uploadImage(byte[] bytes,String fileName,String ids,int type,long tonce,Callback callback){
        if (bytes == null || bytes.length == 0 || TextUtils.isEmpty(fileName)) return;

        // URL
        String url = "http://192.168.10.114:8080?name="+ fileName +"&ids="+ids+"&type="+type;

        OkHttpClient client = getInstance();
        if(client == null)return;
        MediaType mediaType = MediaType.parse("image/jpeg");
        RequestBody body = RequestBody.create(mediaType,bytes);
        Request request = new Request.Builder()
                .url(url)
                .method("POST", body)
                .addHeader("user-agent", "android")
                .addHeader("x-userid", "87875415646")// 添加x-userid请求头
                .addHeader("x-sessionkey", "151561155")// 添加x-sessionkey请求头
                .addHeader("x-tonce", Long.valueOf(tonce).toString())// 添加x-tonce请求头
                .addHeader("x-timestamp", Long.valueOf(tonce).toString())// 添加x-timestamp请求头
                .addHeader("Content-Type", "image/jpeg")
                .build();
        client.newCall(request).enqueue(callback);
    }
}

更多推荐