• 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. };





  • 相关阅读:
    【SQL触发器】类型 FOR 、AFTER、 Instead of到底是什么鬼
    Oracle两种临时表的创建与使用详解
    oracle 临时表(事务级、会话级)
    oracle存储过程游标的使用(批号分摊)
    delphi FastReport快速入门
    Vue 表情包输入组件的实现代码
    一个基于 JavaScript 的开源可视化图表库
    浅淡Webservice、WSDL三种服务访问的方式(附案例)
    记录一下遇到的问题 java将json数据解析为sql语句
    Oracle词汇表(事务表(transaction table)”)
  • 原文地址:https://www.cnblogs.com/wisemen/p/5836839.html
Copyright © 2020-2023  润新知