private void requestTest(){ HttpGet<ExerciseReportModel> httpGet = new HttpGet<>(ExerciseReportModel.class); httpGet.setGetCallback(new HttpGet.IGetCallback<ExerciseReportModel>() { @Override public void onFail(Exception exception) { } @Override public void onSuccess(ExerciseReportModel data) { } }); httpGet.get("url"); }
package com.xxx.view.utils;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.HashMap;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Request;
import okhttp3.Response;
public class HttpGet<T> {
private final static String TAG = "HttpGet";
private T mData;
private Class<T> mClassOfT;
private Handler mMainHandler = new Handler(Looper.getMainLooper());
private Call mCall;
private boolean mCancelFlag = false;
private boolean mGetFlag = false;
public interface IGetCallback<T>{
void onFail(Exception exception);
void onSuccess(T data);
}
private IGetCallback mListener;
public HttpGet(Class<T> classOfT){
mClassOfT = classOfT;
}
public synchronized void setGetCallback(IGetCallback listener){
mListener = listener;
}
public synchronized IGetCallback getGetCallback(){
return mListener;
}
public synchronized void cancel(){
if(mCancelFlag){
return;
}
mListener = null;
mCancelFlag = true;
cancelCall();
}
public synchronized boolean isCancel(){
return mCancelFlag;
}
/**
* get 请求
* @param url
*/
public void get(String url){
get(url, null);
}
/**
* get 请求
* @param url
* @param paraMap
*/
public void get(String url, HashMap<String, String> paraMap){
StringBuilder sb = new StringBuilder();
boolean firstFlag = true;
if(paraMap != null) {
for (String key : paraMap.keySet()) {
String value = paraMap.get(key);
if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) {
if (!firstFlag) {
sb.append("&");
}
sb.append(key).append("=").append(value);
firstFlag = false;
}
}
}
Request.Builder builder = new Request.Builder();
builder.get();
if(sb.length() > 0) {
builder.url(url + "?" + sb.toString());
} else{
builder.url(url);
}
Request request = builder.build();
request(request);
}
/**
* post 请求
* @param url
* @param paraMap
*/
public void post(String url, HashMap<String, String> paraMap){
FormBody.Builder builder = new FormBody.Builder();
if (paraMap != null){
for (String key : paraMap.keySet()) {
String value = paraMap.get(key);
builder.add(key, value);
}
}
FormBody formBody = builder.build();
Request request = new Request.Builder().post(formBody).url(url).build();
request(request);
}
public void request(Request request){
if(request == null || isCancel()){
return;
}
synchronized (this){
if(mGetFlag){
throw new IllegalStateException(" the task has already been executed "
+ "(a task can be executed only once)");
}
mGetFlag = true;
}
Log.i(TAG, "onResponse, url = " + request.url());
//Request request = new Request.Builder().get().url(url).build();
Call call = OkHttpUtil.getHttpClient().newCall(request);
setCall(call);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure, IOException = " + e);
requestFail(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String resultStr = null;
Log.i(TAG, "onResponse, response = " + response);
if(response != null && response.isSuccessful()){
try {
if(response.body() != null) {
resultStr = response.body().string();
}
}catch (IOException e){
e.printStackTrace();
Log.i(TAG, "onResponse, IOException = " + e);
requestFail(e);
return;
}
}
Log.i(TAG, "onResponse, resultStr = " + resultStr);
if( TextUtils.isEmpty(resultStr) ){
requestFail(null);
return;
}
T data = null;
Gson gson = new Gson();
try {
data = gson.fromJson(resultStr, mClassOfT);
} catch (Exception e){
e.printStackTrace();
requestFail(e);
return;
}
if(data != null){
requestSucess(data);
} else{
requestFail(null);
}
}
});
}
private synchronized void cancelCall(){
if(mCall != null){
mCall.cancel();
}
mCall = null;
}
private synchronized boolean isGet(){
return mGetFlag;
}
private synchronized void setCall(Call call){
mCall = call;
}
private void requestFail(Exception e){
if(isCancel()){
return;
}
mMainHandler.post(new Runnable() {
@Override
public void run() {
if(isCancel()){
return;
}
IGetCallback<T> listener = getGetCallback();
if(listener != null){
listener.onFail(e);
}
}
});
}
private void requestSucess(T data){
if(isCancel()){
return;
}
mMainHandler.post(new Runnable() {
@Override
public void run() {
if(isCancel()){
return;
}
IGetCallback<T> listener = getGetCallback();
if(listener != null){
listener.onSuccess(data);
}
}
});
}
}