TOP

NoHttp框架

NoHttp框架

框架简介

开源地址https://github.com/yanzhenjie/NoHttp

  • NoHttp实现了Http1.1(RFC2616),一个标准的Http框架。
  • 请求和下载都是队列,平均分配每个线程的资源,支持多个请求并发。
  • 支持GET、POST、PUT、PATCH、HEAD、DELETE、OPTIONS、TRACE等请求协议。
  • 支持基于POST、PUT、PATCH、DELETE的文件上传(Html表单原理)。
  • 文件下载、上传下载、上传和下载的进度回调、错误回调。
  • 提供了五种数据缓存策略供开发者选择使用(详细看下文)。
  • 支持取消某个请求、取消指定多个请求、取消所有请求。
  • 支持自定义Request,利用NoHttp泛型可以解析成你想要的任何数据格式(String、Json、JavaBean等)。
  • 支持Session、Cookie的自动维持,App重启、关开机后还持续维持。
  • 支持Https、自签名网站Https的访问、支持双向验证。

使用前配置

项目倒入

  1. compile 'com.yolanda.nohttp:nohttp:1.0.5'

需要的权限

  1. <uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
  2. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  3. <uses-permissionandroid:name="android.permission.INTERNET"/>
  4. <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
  5. <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>

初始化

  1. @Override
  2. publicvoid onCreate(){
  3. super.onCreate();
  4. // 初始化NoHttp
  5. NoHttp.init(this);
  6. // 开启调试模式
  7. Logger.setDebug(true);
  8. Logger.setTag("NoHttpSample");
  9. }

使用详解

使用详情可参考官方文档 http://api.nohttp.net/

Demo示例

  • 封装结果回调对象OnResponseListener
    NoHttp的接受结果是用OnResponseListener接口回调,为了方便使用,对它进行做简单封装,请求开始时显示dialog, 请求完成时关闭这个dialog:
  1. publicclassHttpResponseListener<T>implementsOnResponseListener<T>{
  2. /**
  3. * Dialog
  4. */
  5. privateWaitDialog mWaitDialog;
  6. /**
  7. * 当前请求
  8. */
  9. privateRequest<T> mRequest;
  10. /**
  11. * 结果回调
  12. */
  13. privateHttpListener<T> callback;
  14. /**
  15. * 是否显示dialog
  16. */
  17. privateActivity context;
  18. /**
  19. * @param context context用来实例化dialog
  20. * @param request 请求对象
  21. * @param httpCallback 回调对象
  22. * @param canCancel 是否允许用户取消请求
  23. * @param isLoading 是否显示dialog
  24. */
  25. publicHttpResponseListener(Activity context,Request<T> request,HttpListener<T> httpCallback,boolean canCancel,boolean isLoading){
  26. this.context = context;
  27. this.mRequest = request;
  28. if(isLoading){// 需要显示dialog
  29. mWaitDialog =newWaitDialog(context);
  30. mWaitDialog.setCancelable(canCancel);
  31. mWaitDialog.setOnCancelListener(newDialogInterface.OnCancelListener(){
  32. @Override
  33. publicvoid onCancel(DialogInterface dialog){
  34. mRequest.cancel();// dialog被用户关闭时, 取消当前请求
  35. }
  36. });
  37. }
  38. this.callback = httpCallback;
  39. this.isLoading = isLoading;
  40. }
  41. /**
  42. * 开始请求, 这里显示一个dialog
  43. */
  44. @Override
  45. publicvoid onStart(int what){
  46. if(!context.isFinishing && mWaitDialog !=null&&!mWaitDialog.isShowing())
  47. mWaitDialog.show();
  48. }
  49. /**
  50. * 结束请求, 这里关闭dialog
  51. */
  52. @Override
  53. publicvoid onFinish(int what){
  54. if(mWaitDialog !=null&& mWaitDialog.isShowing())
  55. mWaitDialog.dismiss();
  56. }
  57. /**
  58. * 成功回调
  59. */
  60. @Override
  61. publicvoid onSucceed(int what,Response<T> response){
  62. if(callback !=null)
  63. callback.onSucceed(what, response);
  64. }
  65. /**
  66. * 失败回调
  67. */
  68. @Override
  69. publicvoid onFailed(int what,Response<T> response){
  70. if(callback !=null)
  71. callback.onFailed(what, response);
  72. }
  73. }
  • 定义HttpListener接口, 接受请求结果
  1. publicinterfaceHttpListener<T>{
  2. /**
  3. * 请求失败
  4. */
  5. void onSucceed(int what,Response<T> response);
  6. /**
  7. * 请求成功
  8. */
  9. void onFailed(int what,Response<T> response);
  10. }
  • 封装请求入口, 单例模式

看到这里有人可能开始有点迷惑了,不是需要OnResponseListener对象嘛,现在HttpListener怎么用啊?可观别急,我们继续看下面请求入口的封装。
因为NoHttp是队列的请求方式,方便开发者控制并发和线程数量,而NoHttp生成队列都是newInstance,每次都是一个新的队列对象,所以生成的Queue都需要做单列,请看:

  1. publicclassCallServer{
  2. privatestaticCallServer callServer;
  3. /**
  4. * 请求队列
  5. */
  6. privateRequestQueue requestQueue;
  7. privateCallServer(){
  8. requestQueue =NoHttp.newRequestQueue();
  9. }
  10. /**
  11. * 请求队列
  12. */
  13. publicsynchronizedstaticCallServer getRequestInstance(){
  14. if(callServer ==null)
  15. callServer =newCallServer();
  16. return callServer;
  17. }
  18. /**
  19. * 添加一个请求到请求队列
  20. *
  21. * @param context context用来实例化dialog
  22. * @param what 用来标志请求,在回调方法中会返回这个what,类似handler的what
  23. * @param request 请求对象
  24. * @param callback 结果回调对象
  25. * @param canCancel 是否允许用户取消请求
  26. * @param isLoading 是否显示dialog
  27. */
  28. public<T>void add(Context context,int what,Request<T> request,HttpListener<T> callback,boolean canCancel,boolean isLoading){
  29. requestQueue.add(what, request,newHttpResponseListener<T>(context, request, callback, canCancel, isLoading));
  30. }
  31. /**
  32. * 取消这个sign标记的所有请求
  33. */
  34. publicvoid cancelBySign(Object sign){
  35. requestQueue.cancelBySign(sign);
  36. }
  37. /**
  38. * 取消队列中所有请求
  39. */
  40. publicvoid cancelAll(){
  41. requestQueue.cancelAll();
  42. }
  43. /**
  44. * 退出app时停止所有请求
  45. */
  46. publicvoid stopAll(){
  47. requestQueue.stop();
  48. }
  49. }
  • 如何使用
  1. /**
  2. * 发起请求
  3. */
  4. privatevoid requestString(){
  5. Request<String> request =NoHttp.createStringRequest(Constants.URL_NOHTTP_CACHE_STRING);
  6. CallServer.getRequestInstance().add(this,0, request, httpListener,false,true);
  7. }
  8. /**
  9. * 接受响应
  10. */
  11. privateHttpListener<String> httpListener =newHttpListener<String>(){
  12. @Override
  13. publicvoid onSucceed(int what,Response<String> response){
  14. // 拿到请求结果
  15. String result = response.get();
  16. ...
  17. }
  18. @Override
  19. publicvoid onFailed(int what,Response<String> response){
  20. Toast.show("请求失败");
  21. }
  22. };





posted @ 2016-06-03 13:18  星空守候  阅读(777)  评论(0编辑  收藏  举报