NoHttp使用总结

1、NoHttp的特性:
● 支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载,上传下载均有进度。
● 支持304缓存,自定义缓存,302/303重定向,支持代理服务器访问地址(如: Google)。
● NoHttp是队列,自动为请求排队,可以取消指定请求, 可以取消队列所有请求,亦可以停止队列。
● 支持请求String、Bitmap、Json、JavaBean,可自定义扩展请求类型。
● Request对象包涵参数、文件、请求头等;Response对象包涵响应内容,响应头等信息,Cookie。

2、异步请求的流程图:

这里写图片描述

异步请求的描述:
 由UI线程发送请求到队列,队列中是子线程在持续运行,当子线程发现请求进入队列时,马上从队列拿出这个请求,交给解析器(Parser)解析请求,解析器(Parser)拿到请求后要先把请求转换成数据再去解析成泛型,所以解析器(Parser)把请求交给执行器(Executor),执行器(Executor)拿到请求后分析缓存是否过期,若缓存没有过期直接返回数据给解析器;如果缓存过期,执行器(Executor)添加缓存头到请求,调用连接器(Connection)请求服务器,连接器(Connection)在和服务端亲热前会添加之前服务器返回的Cookie(带上暗号),连接器(Connection)和服务端亲热完后会处理Cookie(更新/保存暗号),解析完Cookie后把封装好的数据交给执行器(Executor),由执行器(Executor)处理缓存并发结果发送给解析器(Parser),解析器(Parser)拿到数据后解析成泛型返回给调用解析器(Parser)的子线程,由子线程发送异步结果到UI线程,完成请求。

2、同步请求

这里写图片描述

同步请求的描述:
 Thread调用解析器(Parser)解析请求,解析器(Parser)拿到请求后要先把请求转换成数据再去解析成泛型,所以解析器(Parser)把请求交给执行器(Executor),执行器(Executor)拿到请求后分析缓存是否过期,若缓存没有过期直接返回数据给解析器;如果缓存过期,执行器(Executor)添加缓存头到请求,调用连接器(Connection)请求服务器,连接器(Connection)在和服务端亲热前会添加之前服务器返回的Cookie(带上暗号),连接器(Connection)和服务端亲热完后会处理Cookie(更新/保存暗号),解析完Cookie后把封装好的数据交给执行器(Executor),由执行器(Executor)处理缓存并发结果发送给解析器(Parser),解析器(Parser)拿到数据后解析成泛型返回给Thread。

3、Executor执行器流程图

这里写图片描述

解析器和连接器原理
  解析器(Parser)原理是,从执行器(Executor)拿到ByteArray和Headers后交给Request的parseResponse方法解析泛型结果。
  连接器负责发送数据、传文件,是NoHttp中最重要的一个模块,后边会专门开一篇博客来讲。
执行器流程描述
  当请求进入执行器时,执行器首先读取这个请求的缓存,第一步接着请求是否要求仅仅读取缓存,如果是,当缓存不为null那么返回succeed,如果缓存为null,返回failed,原因是CacheNotFoundError。第二步当不是仅仅读取缓存时,第二步第一种情况缓存不为null时,如果缓存没有过期,直接返回缓存数据,缓存为null时带上缓存去服务器验证缓存是否过期,此时服务器返回304表示刚才验证的缓存没有过期,直接返回刚才的缓存数据,如果返回200表示缓存过期,返回新的数据;第二步第二种情况,当缓存为null时,直接请求服务器,接受到响应后处理缓存,并返回响应数据。

4、异步下载流程图

这里写图片描述

异步下载流程描述
  由UI线程发送请求到队列,队列中是子线程在持续运行,当子线程发现请求进入队列时,马上从队列拿出这个请求,调用下载器(Donwloader)请求服务器,下载器(Donwloader)在和服务端亲热前会添加之前服务器返回的Cookie(带上暗号),下载器(Donwloader)和服务端亲热完后会处理Cookie(更新/保存暗号),解析完Cookie开始下载文件,在下载的过程中调用监听器(Listener)回调状态,监听器(Listener)监听器监听到下载状态发生变化时调用信使(Poster),由信使(Poster)发送异步结果到UI线程,直到请求完成。

5、同步下载流程图:

这里写图片描述

异步下载流程描述
  Thread调用下载器(Donwloader)请求服务器,下载器(Donwloader)在和服务端亲热前会添加之前服务器返回的Cookie(带上暗号),下载器(Donwloader)和服务端亲热完后会处理Cookie(更新/保存暗号),解析完Cookie开始下载文件,在下载的过程中调用监听器(Listener)回调状态,Thread直接拿到下载状态。

6、NoHttp的使用步骤:
(1)创建一个Android项目,并导入nohttp的jar,进行Build Path

这里写图片描述

(2)在AndroidManifest.xml中进行添加权限

这里写图片描述

注意:不能只添加访问网络的权限,否则访问失败,请求不到数据.

(3)进行初始化操作,里面的参数是Application类型

这里写图片描述

(4)进行请求数据的操作:
方式一:GET的请求方式
// 创建请求队列, 默认并发3个请求, 传入数字改变并发数量:

    NoHttp.newRequestQueue(1);
            RequestQueue requestQueue= NoHttp.newRequestQueue();
            // 访问的接口地址
            String url = "http://api.m.panda.tv/ajax_get_live_list_by_cate?cate=yzdr&pageno=1&pagenum=10&__version=1.0.1.1300&__plat=android";
            // 请求的方式
            RequestMethod requestMethod = RequestMethod.GET;
            // 请求的类型,这里请求的是json串,String类型 参数一:请求的接口地址 参数二:请求的方式
            Request<String> request = NoHttp
                    .createStringRequest(url, requestMethod);
            /*
             * what: 当多个请求同时使用同一个OnResponseListener时用来区分请求, 类似handler的what一样
             * request: 请求对象
             *  onResponseListener 回调对象,接受请求结果
             */
            requestQueue.add(1, request, new OnResponseListener<String>() {

                /**
                 * 请求失败的方法
                 */
                @Override
                public void onFailed(int arg0, String arg1, Object arg2,
                        Exception arg3, int arg4, long arg5) {
                    Log.e("tag", "==============onFailed" + arg0);
                }

                /**
                 * 请求结束的方法
                 */
                @Override
                public void onFinish(int arg0) {
                    Log.e("tag", "==============onFinish" + arg0);

                }

                /**
                 * 请求开始的方法
                 */
                @Override
                public void onStart(int arg0) {
                    Log.e("tag", "==============onStart" + arg0);
                }

                /**
                 * 请求成功的方法
                 * 
                 * @param arg0
                 *            你设置的what,用来区分多个请求
                 * @param arg1
                 *            请求返回的结果
                 */
                @Override
                public void onSucceed(int arg0, Response<String> arg1) {
                    if (arg0 == 1) {// 判断what是否是刚才指定的请求
                        Toast.makeText(MainActivity.this, "_________", 0).show();
                        // 请求成功
                        String string = arg1.get();// 响应结果
                        Log.e("tag", "result==========" + string);
                        // 响应头
                        Headers headers = arg1.getHeaders();
                        headers.getResponseCode();// 响应码
                        arg1.getNetworkMillis();// 请求花费的时间
                    }
                }
            });

方式二:Post请求方式

// 创建请求队列, 默认并发3个请求, 传入数字改变并发数量: NoHttp.newRequestQueue(1);
        RequestQueue requestQueue= NoHttp.newRequestQueue();
        //post请求的地址
        String url = "http://api.m.panda.tv/ajax_get_live_list_by_cate";
        //请求方式
        RequestMethod requestMethod = RequestMethod.POST;
        Request<String> request = NoHttp.createStringRequest(url, requestMethod);
        //request.add();可添加参数
        //request.addHeader("","");设置请求头
        //request.setTag();设置Object类型的TAG
        //进行添加post请求的参数
        request.add("cate", "yzdr");
        request.add("pageno", 1);
        request.add("pagenum", 10);
        request.add("__version", "1.0.1.1300");
        request.add("__plat", "android");
        // 参数1.int what标识本请求
        //2.request
        // 3.OnResponseListener监听
         //将request添加到queue请求队列中
        requestQueue.add(1, request, new OnResponseListener<String>() {

            @Override
            public void onFailed(int arg0, String arg1, Object arg2,
                    Exception arg3, int arg4, long arg5) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onFinish(int arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onStart(int arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onSucceed(int arg0, Response<String> arg1) {
                if (arg0==1) {
                    String string = arg1.get();
                    Log.e("tag", "result==========" + string);
                }
            }
        });
NoHttp 是专门做Android网络请求与下载的框架。支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载;支持304缓存,302/303重定向,支持代理服务器。NoHttp特性:支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载,上传下载均有进度。支持304缓存,自定义缓存,302/303重定向,支持代理服务器访问地址(如: Google)。NoHttp是队列,自动为请求排队,可以取消指定请求, 可以取消队列所有请求,亦可以停止队列。支持请求String、Bitmap、Json、JavaBean,可自定义扩展请求类型。Request对象包涵参数、文件、请求头等;Response对象包涵响应内容,响应头等信息,Cookie。使用Gradle构建时添加依赖:// 引用最新版 compile 'com.yolanda.nohttp:nohttp: ' // 或则引用指定版本 compile 'com.yolanda.nohttp:nohttp:1.0.0'一. 请求1.请求String数据// 请求对象 Request request = NoHttp.createStringRequest(url, requestMethod); //添加请求头 request.addHeader("AppVersioin", "2.0"); // 添加请求参数 request.add("userName", "yolanda"); //上传文件 request.add("file", new FileBinary(file)); ...2.请求Json数据// JsonObject Request request = NoHttp.createJsonObjectRequest(url, reqeustMethod); queue.add(what, request, responseListener); … // JsonArray Request request = NoHttp.createJsonArrayRequest(url, reqeustMethod); queue.add(what, request, responseListener);3. 请求Bitmap数据Request request = NoHttp.createImageRequest(url, requestMethod); ...4. 取消请求取消单个请求Request request = NoHttp.createStringRequest(url); ... request.cancel();从队列中取消指定的请求Request request = NoHttp.createStringRequest(url); request.setCancelSign(sign); … queue.cancelBySign(sign);取消队列中所有请求queue.cancelAll();停止队列RequestQueue queue = NoHttp.newRequestQueue(); ... queue.stop();5. 同步请求// 在当前线程发起请求,在线程这么使用 Request request = NoHttp.createStringRequest(url); Response response = NoHttp.startRequestSync(request); if (response.isSucceed()) {     // 请求成功 } else {     // 请求失败 }二. 缓存1. Http标准协议的缓存,比如响应码是304时现在很多公司使用了RESTFUL风格来写Http API,所以这个是必须有的。Request request = NoHttp.createJsonObjectRequest(url); // NoHttp本身是RESTFUL风格的标准Http协议,所以这里不用设置或者设置为DEFAULT request.setCacheMode(CacheMode.DEFAULT); ...2. 当请求服务器失败的时候,读取缓存Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为REQUEST_FAILED_READ_CACHE request.setCacheMode(CacheMode.REQUEST_FAILED_READ_CACHE); ...3. 如果发现有缓存直接成功,没有缓存才请求服务器我们知道ImageLoader的核心除了内存优化外,剩下一个就是发现把内地有图片则直接使用,没有则请求服务器,所以NoHttp这一点非常使用做一个ImageLoader。Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为IF_NONE_CACHE_REQUEST request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST); ...请求图片,缓存图片。// 如果没有缓存才去请求服务器,否则使用缓存,缓存图片演示 Request request = NoHttp.createImageRequest(imageUrl); request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST); ...4. 仅仅读取缓存Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为ONLY_READ_CACHE request.setCacheMode(CacheMode.ONLY_READ_CACHE); ...注意:缓存不管是String、Json、图片还是任何请求都可以被NoHttp缓存二、响应OnResponseListener responseListener = new OnResponseListener() {     @Override     public void onStart(int what) {         // 请求开始时,可以显示一个Dialog     }     @Override     public void onFinish(int what) {         // 请求接受时,关闭Dialog     }     @Override     public void onSucceed(int what, Response response) {         // 接受请求结果         String result = response.get();         // Bitmap imageHead = response.get(); // 如果是bitmap类型,都是同样的用法     }     @Override     public void onFailed(int what, String url, Object tag, Exception exception, ...) {         // 请求失败或者发生异常         // 这里根据exception处理不同的错误,比如超时、网络不好等     } };三. 自定义请求类型: FastJsonRequest1.定义请求对象public class FastJsonRequest extends RestRequestor { public FastJsonRequest(String url) {     super(url); } public FastJsonRequest(String url, RequestMethod requestMethod) {     super(url, requestMethod); } @Override public JSONObject parseResponse(String url, Headers headers, byte[] responseBody) {     String result = StringRequest.parseResponseString(url, headers, responseBody);     JSONObject jsonObject = null;     if (!TextUtils.isEmpty(result)) {         jsonObject = JSON.parseObject(result);     } else {         // 这里默认的错误可以定义为你们自己的数据格式         jsonObject = JSON.toJSON("{}");     }     return jsonObject; } @Override public String getAccept() {     // 告诉服务器你接受什么类型的数据, 会添加到请求头的Accept中     return "application/json;q=1"; } }2.使用自定义请求-和NoHttp默认请求没有区别Request mRequest = new FastJsonRequest(url, requestMethod); queue.add(what, mRequest, responseListener);五. 下载文件发起下载请求//下载文件 downloadRequest = NoHttp.createDownloadRequest(url, fielDir, fileName, true, false); // what 区分下载 // downloadRequest 下载请求对象 // downloadListener 下载监听 CallServer.getDownloadInstance().add(0, downloadRequest, downloadListener);暂停或者停止下载downloadRequest.cancel();监听下载过程private DownloadListener downloadListener = new DownloadListener() {     @Override     public void onStart(int what, boolean resume, long preLenght, Headers header, long count) {     }     @Override     public void onProgress(int what, int progress, long downCount) {         // 更新下载进度     }     @Override     public void onFinish(int what, String filePath) {     }     @Override     public void onDownloadError(int what, StatusCode code, CharSequence message) {     }     @Override     public void onCancel(int what) {     } }; 标签:NoHttp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值