okhttp 上傳圖片java.net.SocketTimeoutException: timeout

使用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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章