package com.cmeiyuan.hello123.api;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
import java.util.Set;
import org.apache.http.Header;
import com.google.gson.Gson;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
public abstract class BaseApi<T> extends AsyncHttpResponseHandler {
protected static final String TAG = "BaseApi";
private Type mType;
private Gson mGson = new Gson();
private AsyncHttpClient mAsyncHttpClient = new AsyncHttpClient();
private AsyncCallBack<T> mAsyncCallBack;
public BaseApi() {
mAsyncHttpClient.setTimeout(30000);
// mAsyncHttpClient.setConnectTimeout(30000);
// mAsyncHttpClient.setResponseTimeout(30000);
mAsyncHttpClient.setMaxRetriesAndTimeout(3, 30000);
mAsyncHttpClient.addHeader("Cache-control", "private");
mAsyncHttpClient.addHeader("Pragma", "private");
}
public AsyncCallBack<T> getAsyncCallBack() {
return mAsyncCallBack;
}
public void setAsyncCallBack(AsyncCallBack<T> mAsyncCallBack) {
this.mAsyncCallBack = mAsyncCallBack;
}
public void get() {
get(null);
}
public void get(Map<String, String> param) {
String url = getUrl();
if (param != null && !param.isEmpty()) {
if (!url.endsWith("?")) {
url += "?";
}
Set<String> keySet = param.keySet();
int i = 0;
for (String key : keySet) {
url += key;
url += "=";
url += param.get(key);
if (i < param.size() - 1) {
url += "&";
}
i++;
}
}
mAsyncHttpClient.get(url, this);
}
protected abstract String getUrl();
protected Type getType() {
if (mType == null) {
// 获取类型
Class<?> cls = getClass();
// 获取带泛型的父类
Type type = cls.getGenericSuperclass();
// 转换成参数化类型
ParameterizedType p = (ParameterizedType) type;
Type[] types = p.getActualTypeArguments();
mType = types[0];
}
return mType;
}
@Override
public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
if (mAsyncCallBack != null) {
Error error = null;
T t = null;
try {
String json = new String(arg2);
t = mGson.fromJson(json, getType());
} catch (Exception e) {
error = new Error();
error.code = 1001;
error.message = "解析数据出错";
error.detail = e.toString();
}
if (error == null) {
mAsyncCallBack.onSuccess(t);
} else {
mAsyncCallBack.onFailed(error);
}
}
}
@Override
public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
if (mAsyncCallBack != null) {
try {
String result = new String(arg2);
Error error = new Error();
error.code = arg0;
error.message = result;
error.detail = arg3.toString();
mAsyncCallBack.onFailed(error);
} catch (Exception e) {
Error error = new Error();
error.code = 1001;
error.message = "解析数据出错";
error.detail = e.toString();
mAsyncCallBack.onFailed(error);
}
}
}
public interface AsyncCallBack<T> {
public void onSuccess(T t);
public void onFailed(Error error);
}
public static class Error {
int code;
String message;
String detail;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
}
}