package com.cheng.networkframestudy.okhttp.frame; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.util.Log; import com.cheng.networkframestudy.okhttp.frame.builder.GetBuilder; import com.cheng.networkframestudy.okhttp.frame.builder.PostFileBuilder; import com.cheng.networkframestudy.okhttp.frame.builder.PostFormBuilder; import com.cheng.networkframestudy.okhttp.frame.builder.PostStringBuilder; import com.cheng.networkframestudy.okhttp.frame.callback.Callback; import com.cheng.networkframestudy.okhttp.frame.cookie.SimpleCookieJar; import com.cheng.networkframestudy.okhttp.frame.https.HttpsUtil; import com.cheng.networkframestudy.okhttp.frame.request.RequestCall; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.TimeUnit; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLSession; import okhttp3.Call; import okhttp3.OkHttpClient; import okhttp3.Response; /** * 李旺成 * 2016年2月20日08:09:34 */ public class OkHttpUtil { public static final String TAG = "OkHttpUtil"; public static final long DEFAULT_MILLISECONDS = 10000; private static OkHttpUtil sInstance; private OkHttpClient mOkHttpClient; private Handler mDelivery; // 分发器,将子线程返回结果分发到主线程 private boolean mIsDebug; // 是否为Debug模式 private String mTag; // 日志输入的Tag private OkHttpUtil() { OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder(); // cookie enabled okHttpClientBuilder.cookieJar(new SimpleCookieJar()); this.mDelivery = new Handler(Looper.getMainLooper()); if (true) { okHttpClientBuilder.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); } this.mOkHttpClient = okHttpClientBuilder.build(); } public OkHttpUtil debug(String tag) { this.mIsDebug = true; this.mTag = tag; return this; } public static OkHttpUtil getInstance() { if (sInstance == null) { synchronized (OkHttpUtil.class) { if (sInstance == null) { sInstance = new OkHttpUtil(); } } } return sInstance; } public Handler getDelivery() { return mDelivery; } public OkHttpClient getOkHttpClient() { return mOkHttpClient; } public static GetBuilder get() { return new GetBuilder(); } public static PostStringBuilder postString() { return new PostStringBuilder(); } public static PostFileBuilder postFile() { return new PostFileBuilder(); } public static PostFormBuilder post() { return new PostFormBuilder(); } public void execute(final RequestCall requestCall, Callback callback) { if (mIsDebug) { if (TextUtils.isEmpty(mTag)) { this.mTag = TAG; } Log.d(mTag, "{method:" + requestCall.getRequest().method() + ", detail:" + requestCall.getOkHttpRequest().toString() + "}"); } if (callback == null) callback = Callback.CALLBACK_DEFAULT; final Callback finalCallback = callback; requestCall.getCall().enqueue(new okhttp3.Callback() { @Override public void onFailure(Call call, final IOException e) { sendFailResultCallback(call, e, finalCallback); } @Override public void onResponse(final Call call, final Response response) { if (response.code() >= 400 && response.code() <= 599) { try { sendFailResultCallback(call, new RuntimeException(response.body().string()), finalCallback); } catch (IOException e) { e.printStackTrace(); } return; } try { Object o = finalCallback.parseNetworkResponse(response); sendSuccessResultCallback(o, finalCallback); } catch (Exception e) { sendFailResultCallback(call, e, finalCallback); } } }); } public void sendFailResultCallback(final Call call, final Exception e, final Callback callback) { if (callback == null) return; this.mDelivery.post(new Runnable() { @Override public void run() { callback.onError(call, e); callback.onAfter(); } }); } public void sendSuccessResultCallback(final Object object, final Callback callback) { if (callback == null) return; this.mDelivery.post(new Runnable() { @Override public void run() { callback.onResponse(object); callback.onAfter(); } }); } public void cancelTag(Object tag) { for (Call call : mOkHttpClient.dispatcher().queuedCalls()) { if (tag.equals(call.request().tag())) { call.cancel(); } } for (Call call : mOkHttpClient.dispatcher().runningCalls()) { if (tag.equals(call.request().tag())) { call.cancel(); } } } public void setCertificates(InputStream... certificates) { mOkHttpClient = getOkHttpClient().newBuilder() .sslSocketFactory(HttpsUtil.getSslSocketFactory(certificates, null, null)) .build(); } public void setConnectTimeout(int timeout, TimeUnit units) { mOkHttpClient = getOkHttpClient().newBuilder() .connectTimeout(timeout, units) .build(); } }