网络请求是所有App都必不可少的功能,如果每次开发都重写一次网络请求或者将以前的代码复制到新的App中,不是很合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就可以避免每次都要重新编写网络请求,于是基于我比较熟悉的asynchttpclient重新二次封装了一个网络请求框架。

思路:网络请求层唯一的功能就是发送请求,接收响应数据,请求取消,cookie处理这几个功能,二次助封装后这些功能可以直接调用封装好的方法即可。

二次助封装代码如下:

1.功能接口:

/*********************************************************** @文件名称:DisposeDataListener.java* @文件作者:rzq* @创建时间:2015年8月19日 上午11:01:13* @文件描述:* @修改历史:2015年8月19日创建初始版本**********************************************************/
public interface DisposeDataListener
{/*** 请求开始回调事件处理*/public void onStart();/*** 请求成功回调事件处理*/public void onSuccess(Object responseObj);/*** 请求失败回调事件处理*/public void onFailure(Object reasonObj);/*** 请求重连回调事件处理*/public void onRetry(int retryNo);/*** 请求进度回调事件处理*/public void onProgress(long bytesWritten, long totalSize);/*** 请求结束回调事件处理*/public void onFinish();/*** 请求取消回调事件处理*/public void onCancel();
}

2.请求功能接口适配器模式

public class DisposeDataHandle implements DisposeDataListener
{@Overridepublic void onStart(){}@Overridepublic void onSuccess(Object responseObj){}@Overridepublic void onFailure(Object reasonObj){}@Overridepublic void onRetry(int retryNo){}@Overridepublic void onProgress(long bytesWritten, long totalSize){}@Overridepublic void onFinish(){}@Overridepublic void onCancel(){}
}

3.请求回调事件处理:

/*********************************************************** @文件名称:BaseJsonResponseHandler.java* @文件作者:rzq* @创建时间:2015年8月19日 上午10:41:46* @文件描述:服务器Response基础类,包括了java层异常和业务逻辑层异常码定义* @修改历史:2015年8月19日创建初始版本**********************************************************/
public class BaseJsonResponseHandler extends JsonHttpResponseHandler
{/*** the logic layer exception, may alter in different app*/protected final String RESULT_CODE = "ecode";protected final int RESULT_CODE_VALUE = 0;protected final String ERROR_MSG = "emsg";protected final String EMPTY_MSG = "";/*** the java layer exception*/protected final int NETWORK_ERROR = -1; // the network relative errorprotected final int JSON_ERROR = -2; // the JSON relative errorprotected final int OTHER_ERROR = -3; // the unknow error/*** interface and the handle class*/protected Class<?> mClass;protected DisposeDataHandle mDataHandle;public BaseJsonResponseHandler(DisposeDataHandle dataHandle, Class<?> clazz){this.mDataHandle = dataHandle;this.mClass = clazz;}public BaseJsonResponseHandler(DisposeDataHandle dataHandle){this.mDataHandle = dataHandle;}/*** only handle the success branch(ecode == 0)*/public void onSuccess(JSONObject response){}/*** handle the java exception and logic exception branch(ecode != 0)*/public void onFailure(Throwable throwObj){}@Overridepublic void onSuccess(int statusCode, Header[] headers, JSONObject response){onSuccess(response);}@Overridepublic void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse){onFailure(throwable);}
}/*********************************************************** @文件名称:CommonJsonResponseHandler.java* @文件作者:rzq* @创建时间:2015年8月19日 上午11:01:13* @文件描述:业务逻辑层真正处理的地方,包括java层异常和业务层异常* @修改历史:2015年8月19日创建初始版本**********************************************************/
public class CommonJsonResponseHandler extends BaseJsonResponseHandler
{public CommonJsonResponseHandler(DisposeDataHandle dataHandle){super(dataHandle);}public CommonJsonResponseHandler(DisposeDataHandle dataHandle, Class<?> clazz){super(dataHandle, clazz);}@Overridepublic void onStart(){mDataHandle.onStart();}@Overridepublic void onProgress(long bytesWritten, long totalSize){mDataHandle.onProgress(bytesWritten, totalSize);}@Overridepublic void onSuccess(JSONObject response){handleResponse(response);}@Overridepublic void onFailure(Throwable throwObj){mDataHandle.onFailure(new LogicException(NETWORK_ERROR, throwObj.getMessage()));}@Overridepublic void onCancel(){mDataHandle.onCancel();}@Overridepublic void onRetry(int retryNo){mDataHandle.onRetry(retryNo);}@Overridepublic void onFinish(){mDataHandle.onFinish();}/*** handle the server response*/private void handleResponse(JSONObject response){if (response == null){mDataHandle.onFailure(new LogicException(NETWORK_ERROR, EMPTY_MSG));return;}try{if (response.has(RESULT_CODE)){if (response.optInt(RESULT_CODE) == RESULT_CODE_VALUE){if (mClass == null){mDataHandle.onSuccess(response);}else{Object obj = ResponseEntityToModule.parseJsonObjectToModule(response, mClass);if (obj != null){mDataHandle.onSuccess(obj);}else{mDataHandle.onFailure(new LogicException(JSON_ERROR, EMPTY_MSG));}}}else{if (response.has(ERROR_MSG)){mDataHandle.onFailure(new LogicException(response.optInt(RESULT_CODE), response.optString(ERROR_MSG)));}else{mDataHandle.onFailure(new LogicException(response.optInt(RESULT_CODE), EMPTY_MSG));}}}else{if (response.has(ERROR_MSG)){mDataHandle.onFailure(new LogicException(OTHER_ERROR, response.optString(ERROR_MSG)));}}}catch (Exception e){mDataHandle.onFailure(new LogicException(OTHER_ERROR, e.getMessage()));e.printStackTrace();}}
}

4.自定义异常类,对java异常和业务逻辑异常封装统一处理

/*********************************************************** @文件名称:LogicException.java* @文件作者:rzq* @创建时间:2015年8月19日 上午10:05:08* @文件描述:自定义异常类,返回ecode,emsg到业务层* @修改历史:2015年8月19日创建初始版本**********************************************************/
public class LogicException extends Exception
{private static final long serialVersionUID = 1L;/*** the server return code*/private int ecode;/*** the server return error message*/private String emsg;public LogicException(int ecode, String emsg){this.ecode = ecode;this.emsg = emsg;}public int getEcode(){return ecode;}public String getEmsg(){return emsg;}
}

5.请求发送入口类CommonClient:

/*********************************************************** @文件名称:CommonClient.java* @文件作者:rzq* @创建时间:2015年8月19日 上午11:38:57* @文件描述:通用httpclient,支持重连,取消请求,Cookie存储* @修改历史:2015年8月19日创建初始版本**********************************************************/
public class CommonClient
{private static AsyncHttpClient client;static{/*** init the retry exception*/AsyncHttpClient.allowRetryExceptionClass(IOException.class);AsyncHttpClient.allowRetryExceptionClass(SocketTimeoutException.class);AsyncHttpClient.allowRetryExceptionClass(ConnectTimeoutException.class);/*** init the block retry exception*/AsyncHttpClient.blockRetryExceptionClass(UnknownHostException.class);AsyncHttpClient.blockRetryExceptionClass(ConnectionPoolTimeoutException.class);client = new AsyncHttpClient();}public static RequestHandle get(String url, AsyncHttpResponseHandler responseHandler){return client.get(url, responseHandler);}public static RequestHandle get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){return client.get(url, params, responseHandler);}public static RequestHandle get(Context context, String url, AsyncHttpResponseHandler responseHandler){return client.get(context, url, responseHandler);}public static RequestHandle get(Context context, String url, RequestParams params,AsyncHttpResponseHandler responseHandler){return client.get(context, url, params, responseHandler);}public static RequestHandle get(Context context, String url, Header[] headers, RequestParams params,AsyncHttpResponseHandler responseHandler){return client.get(context, url, headers, params, responseHandler);}public static RequestHandle post(String url, AsyncHttpResponseHandler responseHandler){return client.post(url, responseHandler);}public static RequestHandle post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){return client.post(url, params, responseHandler);}public static RequestHandle post(Context context, String url, RequestParams params,AsyncHttpResponseHandler responseHandler){return client.post(context, url, params, responseHandler);}public static RequestHandle post(Context context, String url, HttpEntity entity, String contentType,AsyncHttpResponseHandler responseHandler){return client.post(context, url, entity, contentType, responseHandler);}public static RequestHandle post(Context context, String url, Header[] headers, RequestParams params,String contentType, AsyncHttpResponseHandler responseHandler){return client.post(context, url, headers, params, contentType, responseHandler);}public static RequestHandle post(Context context, String url, Header[] headers, HttpEntity entity,String contentType, AsyncHttpResponseHandler responseHandler){return client.post(context, url, headers, entity, contentType, responseHandler);}/*** calcel the context relative request* @param context* @param mayInterruptIfRunning*/public void calcelRequests(Context context, boolean mayInterruptIfRunning){client.cancelRequests(context, mayInterruptIfRunning);}/*** cancel current all request in app* @param mayInterruptIfRunning*/public void cacelAllrequests(boolean mayInterruptIfRunning){client.cancelAllRequests(mayInterruptIfRunning);}public static void setHttpContextAttribute(String id, Object obj){client.getHttpContext().setAttribute(id, obj);}public static Object getHttpContextAttribute(String id){return client.getHttpContext().getAttribute(id);}public static void removeHttpContextAttribute(String id){client.getHttpContext().removeAttribute(id);}/*** set the cookie store* @param cookieStore*/public static void setCookieStore(CookieStore cookieStore){client.setCookieStore(cookieStore);}/*** remove the cookie store*/public static void removeCookieStore(){removeHttpContextAttribute(ClientContext.COOKIE_STORE);}
}

6.登陆DEMO使用

Cookie的保存,

public class MyApplicaton extends Application {private static MyApplicaton app;@Overridepublic void onCreate() {super.onCreate();app = this;/*** 为全局 CommonClient添加CookieStore,从PersistentCookieStore中可以拿出所有Cookie*/CommonClient.setCookieStore(new PersistentCookieStore(this));}public static MyApplicaton getInstance() {return app;}
}

响应体的处理:

   private void requestLogin(){RequestParams params = new RequestParams();params.put("mb", "");params.put("pwd", "");CommonClient.post(this, URL, params, new CommonJsonResponseHandler(new DisposeDataHandle(){@Overridepublic void onSuccess(Object responseObj){Log.e("------------->", responseObj.toString());}@Overridepublic void onFailure(Object reasonObj){Log.e("----->", ((LogicException)reasonObj).getEmsg());}@Overridepublic void onProgress(long bytesWritten, long totalSize){Log.e("------------->", bytesWritten + "/" + totalSize);}}));}

经过以上封装后,基于的http功能都具备了,如果开发中遇到一些特殊的功能,可能再根据具体的需求扩展。
    源码下载

android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件相关推荐

  1. 熹乐科技范维肖CC:基于开源 YoMo 框架构建“全球同服”的 Realtime Metaverse Application

    前言 在「RTE2022 实时互联网大会」中,熹乐科技创始人 & CEO @范维肖CC 以<基于开源 YoMo 框架构建"全球同服"的 Realtime Metave ...

  2. GSF基于PHP Swoole Framework进行二次封装

    基于Swoole框架的封装扩展和完善,Swoole由于其文档太少,难度对于PHP程序员来说过于大,很多php程序员敬而远之. 工作之余基于Swoole frame 进行了二次封装,不断完善中 暂时定名 ...

  3. Github-Client(ANDROID)开源之旅(二) ------ 浅析ActionBarSherkLock

    接上篇博文:Github-Client(ANDROID)开源之旅(一) ------ 初探GitHub 其中提到了Github-Client用到了很多开源的第三方库 首单其冲的便是ActionBarS ...

  4. java二次封装_基于OKhttp+Rxjava2+Retrofit进行二次封装

    概述 基于Retrofit进行二次封装,优雅的初始化设置.基于Okhttp拦截器和基础缓存,封装了无网络和其他所有场景的缓存策略支持,以及频繁调用请求的丢弃策略. 特性 1.基于Retrofit的二次 ...

  5. WebView独立进程方案-基于腾讯X5的二次封装

    文章目录 更新记录 2021-12-06 2021-10-20 前言概述 基本使用 架构流程 命令模式 预初始化 前端使用文档与代码 参考 更新记录 2021-12-06 WebView支持多进程多任 ...

  6. iOS安全之二次封装AFN并设置请求头/执行HTTPS加强安全

    以前都是直接复制粘贴二次封装好的代码 , 现在都忘了怎么写 . 恰好当前项目要用到请求头 , 在网上学习了一下 , 统一敲了一遍 .自从到了现在公司 , 才发现要学的东西太多了 , 当然 , 有个好的 ...

  7. Android基于开源项目搭建自己的技术堆栈

    一.app的整体架构 从较高的层次讲,一个APP的整体架构可以分为两层,即应用层和基础框架层. 1.应用层专注于行业领域的实现,如金融.支付.地图.社交等,它直接面向用户,是用户对产品的第一层感知. ...

  8. android主流开源自动化框架(monkeyrunner,robotium,uiautomator

    2019独角兽企业重金招聘Python工程师标准>>> android自动化框架: Uiautomator: 优点:可以对所有操作进行自动化,操作简单:缺点:Android版本需要高 ...

  9. 基于若依框架的二次开发_SAP Commerce(原Hybris)的订单处理框架和SAP CRM One Order框架...

    最近工作重点转移到了SAP Commerce上来,正好有机会把该产品里由Java实现的订单处理框架和我之前长期工作过的,ABAP实现的SAP CRM One Order框架做个比较:基于Spring的 ...

  10. 基于大华SDK的二次开发,用于网络摄像头图像的实时显示和捕获(附源码)

    目录 1. 文章背景 2. 主要模块 2.1 初始化SDK 2.2 登录账号 2.3 捕获图片 2.4 实时显示 2.5 断开时释放 2.6 回调函数 3. 源代码 3.1 头文件 3.2 源文件 1 ...

最新文章

  1. 判断一个数为多少位 比如 3 是 1位 102 是3位。
  2. [Java Web整合开发王者归来·刘京华] 1、 Java Web开发
  3. 【学习笔记】SAP FI 业务范围的概念
  4. openocd for windows
  5. flink 本地_Flink原理Apache Flink漫谈系列 State
  6. webdriverAPI-Java
  7. 前端工程师,会是一群高情商的程序猿
  8. UVA10194 Football (aka Soccer)【排序】
  9. 人类高质量编程语言Delphi盛大发布2021新版本RAD Studio 11 Alexandria
  10. 新手购买单反终极攻略--谈谈现场验机的要领与要点
  11. PowerBuilder 生成条形码
  12. 9-24 服务器连接一体机部署
  13. Easy Excel 使用快速入门
  14. SQL SEVER登录失败,无法连接服务器或已成功与服务器建立连接,但是在登录过程中发生错误。(Win10版本,SQL 2019)
  15. 陆奇最新演讲高清PPT下载;AI 绘画20+工具体验汇总;我愿称MOSS为全球开源界最强;思否AIGC黑客马拉松北京站 | ShowMeAI日报
  16. K8S 1.18.0 以及KubeEdge 1.10.3 三机安装部署(含过程记录及遇到的报错和解决方法)
  17. 【AI 学习】2.机器学习和深度学习综述
  18. 在哪里能看到计算机缓存大小,win10系统查看电脑硬盘缓存大小的办法
  19. 第二十二章 SQL函数 CAST(一)
  20. Vuepress + GitHub Actions实现文档博客自动部署

热门文章

  1. jQuery:实现折叠菜单二级联动动画
  2. Javascript:利用闭包实现高级排他
  3. Javascript特效:侧边广告
  4. Openlayer:学习笔记之简单的ol.View应用
  5. webpack前端工程打包入门级教程
  6. ML/DL-复习笔记【三】- 算法的评价指标
  7. 交叉熵损失的来源、说明、求导与pytorch实现
  8. 深度学习超参数简单理解:learning rate,weight decay和momentum
  9. 前端路由和后端路由(浅聊)
  10. 机器学习系统设计(一)--入门之环境搭建