使用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);
}
}