- 底层Okhttp请求方法Listener
public class OkhttpListener<T> {
public static Handler mMainHandler = new Handler(Looper.getMainLooper());
private Type mType;
private AsyncTaskListener<T> mListener;
public OkhttpListener(Type type, AsyncTaskListener<T> listener) {
this.mListener = listener;
this.mType = type;
mListener.onStart();
}
public void onProgress(float progress, long total) {
}
public void onError(final Call call, final Exception e) {
mMainHandler.post(new Runnable() {
@Override
public void run()
Log.e("Okhttp onError--->", "error");
mListener.onFinish();
e.printStackTrace();
}
});
}
public void onSeccess(Call call, final Response response) {
//final T obj = onParseResponse(call, response);
String json = "";
try {
json = response.body().string();
Log.e("okhttp ", " " + response.code() + json.toString());
if (response.code() == 200) {
final T bean;
try {
bean = GsonUtils.getInstance().fromJson(json, mType);
mMainHandler.post(new Runnable() {
@Override
public void run() {
mListener.onSuccess(bean);
// Log.e("Okhttp ---->", json);
mListener.onFinish();
}
});
} catch (Exception e) {
Log.e("Okhttp ---->", "解析异常");
mListener.onFailure(new FailureBean(FailureBean.ERROR_PARSE, "数据解析异常"));
}
} else {
try {
final FailureBean bean = GsonUtils.getInstance().fromJson(json, FailureBean.class);
mMainHandler.post(new Runnable() {
@Override
public void run() {
mListener.onFailure(bean);
mListener.onFinish();
}
});
Log.e("Okhttp ---->Error", " " + response.code() + " msg" + response.message());
} catch (final Exception e) {
mMainHandler.post(new Runnable() {
@Override
public void run() {
mListener.onFailure(new FailureBean(FailureBean.ERROR_PARSE, "数据获取失败"));
e.printStackTrace();
}
});
}
}
} catch (IOException e) {
e.printStackTrace();
}
response.close(); //无论任何情况都要关闭该对象
}
}
- Okhttps请求方法抽象类实现
public abstract class AsyncTaskListener<T> {
public void onStart() {
}
public abstract void onSuccess(T bean);
public void onFailure(FailureBean bean) {
try {
if (System.currentTimeMillis() - MyApplication.HTTPfailTime > 10000) {
MyApplication.HTTPfailTime = System.currentTimeMillis();
if (APIConstant.FAIL_CODE_RELODE == bean.getCode()) {
// if (UserManager.getInstance().hasLoginUser() != null) {
if (MyApplication.mApplication.getCurContext() != null) {
//UserManager.getInstance().logout();
Intent intent = new Intent(MyApplication.mApplication.getCurContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
MyApplication.mApplication.getCurContext().startActivity(intent);
}
}
// }
}
} catch (Exception e) {
}
}
public void onFinish() {
}
}
- okhttps请求方式以及数据传输方式封装
public class OkhttpUtil {
public static final String METHOD_GET = "GET";
public static final String METHOD_POST = "POST";
public static final String METHOD_PUT = "PUT";
public static final String METHOD_DELETE = "DELETE";
/**
* get要求
*
* @param url:url
* @param okhttpListener:回调接口,onFailure方法在要求失败时调用,onResponse方法在要求成功后调用,这两个方法都执行在UI线程。
*/
public static void okHttpGet(String url, OkhttpListener okhttpListener) {
okHttpGet(url, null, null, okhttpListener);
}
/**
* get要求,可以传递参数
*
* @param url:url
* @param paramsMap:map集合,封装键值对参数
* @param okhttpListener
*/
public static void okHttpGet(String url, Map<String, Object> paramsMap, OkhttpListener okhttpListener) {
okHttpGet(url, paramsMap, null, okhttpListener);
}
/**
* get要求,可以传递参数
*
* @param url:url
* @param paramsMap:map集合,封装键值对参数
* @param headerMap:map集合,封装要求头键值对
* @param okhttpListener
*/
public static void okHttpGet(String url, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener okhttpListener) {
new RequestUtil(METHOD_GET, url, paramsMap, headerMap, okhttpListener).enqueue();
}
/**
* post要求
*
* @param url:url
* @param okhttpListener
*/
public static void okHttpPost(String url, OkhttpListener okhttpListener) {
okHttpPost(url, null, okhttpListener);
}
/**
* post要求,可以传递参数
*
* @param url:url
* @param paramsMap
* @param okhttpListener
*/
public static void okHttpPost(String url, Map<String, Object> paramsMap, OkhttpListener okhttpListener) {
okHttpPost(url, paramsMap, null, okhttpListener);
}
/**
* post要求,可以传递参数
*
* @param url:url
* @param paramsMap:map集合,封装键值对参数
* @param headerMap:map集合,封装要求头键值对
* @param okhttpListener
*/
public static void okHttpPost(String url, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener okhttpListener) {
new RequestUtil(METHOD_POST, url, paramsMap, headerMap, okhttpListener).enqueue();
}
/**
* Put要求
*
* @param url:url
* @param callBack
*/
public static void okHttpPut(String url, OkhttpListener callBack) {
okHttpPut(url, null, callBack);
}
/**
* Put要求,可以传递参数
*
* @param url:url
* @param paramsMap:map集合,封装键值对参数
* @param okhttpListener
*/
public static void okHttpPut(String url, Map<String, Object> paramsMap, OkhttpListener okhttpListener) {
okHttpPut(url, paramsMap, null, okhttpListener);
}
/**
* Put要求,可以传递参数
*
* @param url:url
* @param paramsMap:map集合,封装键值对参数
* @param headerMap:map集合,封装要求头键值对
* @param okhttpListener
*/
public static void okHttpPut(String url, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener okhttpListener) {
new RequestUtil(METHOD_PUT, url, paramsMap, headerMap, okhttpListener).enqueue();
}
/**
* Delete
*
* @param url:url
* @param okhttpListener
*/
public static void okHttpDelete(String url, OkhttpListener okhttpListener) {
okHttpDelete(url, null, okhttpListener);
}
/**
* Delete
*
* @param url:url
* @param paramsMap:map集合,封装键值对参数
* @param okhttpListener
*/
public static void okHttpDelete(String url, Map<String, Object> paramsMap, OkhttpListener okhttpListener) {
okHttpDelete(url, paramsMap, null, okhttpListener);
}
/**
* Delete
*
* @param url:url
* @param paramsMap:map集合,封装键值对参数
* @param headerMap:map集合,封装要求头键值对
* @param okhttpListener
*/
public static void okHttpDelete(String url, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener okhttpListener) {
new RequestUtil(METHOD_DELETE, url, paramsMap, headerMap, okhttpListener).enqueue();
}
/**
* post要求,json传参方式
*
* @param url:url
* @param jsonStr:json格式的键值对参数
* @param okhttpListener
*/
public static void okHttpPostJson(String url, String jsonStr, OkhttpListener okhttpListener) {
okHttpPostJson(url, jsonStr, null, okhttpListener);
}
/**
* post要求,json传参方式
*
* @param url:url
* @param jsonStr:json格式的键值对参数
* @param headerMap:map集合,封装要求头键值对
* @param okhttpListener
*/
public static void okHttpPostJson(String url, String jsonStr, Map<String, Object> headerMap, OkhttpListener okhttpListener) {
new RequestUtil(METHOD_POST, url, jsonStr, headerMap, okhttpListener).enqueue();
}
/**
* 判断网络是否连接
*
* @param context
* @return
*/
public static boolean isConnected(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (null != connectivity) {
NetworkInfo info = connectivity.getActiveNetworkInfo();
if (null != info && info.isConnected()) {
if (info.getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
return false;
}
}
- 数据处理及调用请求方式
public void loginPassword(String loginId, String password, String enterpriseId, final AsyncTaskListener<ParentUserBean> listener) {
Map map = new HashMap();
map.put(APIConstant.LOGIN_BASIC_LOGIN_ID, loginId);
map.put(APIConstant.REQUEST_PARAM_PASSWORD, password);
map.put(APIConstant.LOGIN_BASIC_ENTERPRISE_ID, enterpriseId);
OkhttpUtil.okHttpGet(APIConstant.LOGIN, map, new OkhttpListener(ParentUserBean.class, listener));
}
- Activity重写抽象方法,并调用对应的TASK
new AccountNewTask().loginPassword(loginID, password, companyCode, new AsyncTaskListener<ParentUserBean>() {
@Override
public void onStart() {
super.onStart();
progressDialog.setMessage(getString(R.string.login_load));
progressDialog.show();
progressDialog.setCanceledOnTouchOutside(false);
}
@Override
public void onSuccess(ParentUserBean bean) {
if ("200".equals(bean.getStatusCode())) {
saveCompanyCode(bean);
finishActivity(companyCode);
} else {
final AlertDialog alertDialog = new AlertDialog.Builder(LoginActivity.this)
.setTitle(getString(R.string.login_error))
.setMessage(bean.getMassage())
.setNegativeButton(getString(R.string.confirm), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create();
alertDialog.show();
progressDialog.hide();
}
}
@Override
public void onFailure(FailureBean bean) {
super.onFailure(bean);
progressDialog.dismiss();
Toast.makeText(LoginActivity.this, getString(R.string.loading_network_error), Toast.LENGTH_SHORT).show();
}
@Override
public void onFinish() {
progressDialog.dismiss();
super.onFinish();
}
});
网络请求
public class RequestUtil {
private String mMetyodType; //请求方式,get和post
private String mUrl;
private Map<String, Object> mParamsMap; //键值对类型的参数,只有这一种情况下区分post和get。
private String mJsonStr; //json类型的参数,post方式
private Map<String, Object> mHeaderMap; //头参数
private OkhttpListener mCallBack; //回调
private static OkHttpClient mOkHttpClient;
private Request.Builder mRequestBuilder;
private Request mOkHttpRequest;
RequestUtil(String methodType, String url, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener callBack) {
this(methodType, url, null, paramsMap, headerMap, callBack);
}
RequestUtil(String methodType, String url, String jsonStr, Map<String, Object> headerMap, OkhttpListener callBack) {
this(methodType, url, jsonStr, null, headerMap, callBack);
}
private RequestUtil(String methodType, String url, String jsonStr, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener callBack) {
mMetyodType = methodType;
mUrl = url;
mJsonStr = jsonStr;
mParamsMap = paramsMap;
mHeaderMap = headerMap;
mCallBack = callBack;
getInstance();
}
/**
* 创建OKhttpClient实例。
*/
private void getInstance() {
mRequestBuilder = new Request.Builder();
getClientIns();
//设置参数
switch (mMetyodType) {
case OkhttpUtil.METHOD_GET:
setGetParams();
break;
case OkhttpUtil.METHOD_POST:
mRequestBuilder.post(getRequestBody());
break;
case OkhttpUtil.METHOD_PUT:
mRequestBuilder.put(getRequestBody());
break;
case OkhttpUtil.METHOD_DELETE:
mRequestBuilder.delete(getRequestBody());
break;
}
mRequestBuilder.url(mUrl);
if (mHeaderMap != null) {
setMyHeader();
} else {
//setHeader();
}
//mRequestBuilder.addHeader("Authorization","Bearer "+"token");可以把token添加到这儿
mOkHttpRequest = mRequestBuilder.build();
}
private OkHttpClient getClientIns() {
if (mOkHttpClient == null) {
synchronized (RequestUtil.class) {
if (mOkHttpClient == null) {
mOkHttpClient = new OkHttpClient();
}
}
}
return mOkHttpClient;
}
/**
* request post得到body对象
*/
private RequestBody getRequestBody() {
if (!TextUtils.isEmpty(mJsonStr)) {
MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式,
return RequestBody.create(JSON, mJsonStr);//json数据,
}
FormBody.Builder formBody = new FormBody.Builder();
if (mParamsMap != null) {
for (String key : mParamsMap.keySet()) {
if (mParamsMap.get(key) != null) {
formBody.add(key, mParamsMap.get(key).toString());
}
}
}
return formBody.build();
}
/**
* get请求,只有键值对参数
*/
private void setGetParams() {
if (mParamsMap != null) {
mUrl = mUrl + "?";
for (String key : mParamsMap.keySet()) {
mUrl = mUrl + key + "=" + mParamsMap.get(key) + "&";
}
mUrl = mUrl.substring(0, mUrl.length() - 1);
Log.e("okhttp url: ", mUrl);
}
}
/**
* 设置请求头,自己传的
*/
private void setMyHeader() {
if (mHeaderMap != null) {
for (Object key : mHeaderMap.keySet()) {
mRequestBuilder.addHeader(key.toString(), mHeaderMap.get(key).toString());
}
}
}
void enqueue() {
mOkHttpClient.newCall(mOkHttpRequest).enqueue(new Callback() {
@Override
public void onFailure(final Call call, final IOException e) {
if (mCallBack != null) {
mCallBack.onError(call, e);
}
}
@Override
public void onResponse(final Call call, final Response response) throws IOException {
if (mCallBack != null) {
mCallBack.onSeccess(call, response);
}
}
});
}
}