NoHttp使用总结

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

2、异步请求的流程图:

NoHttp使用总结_第1张图片

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

2、同步请求

NoHttp使用总结_第2张图片

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

3、Executor执行器流程图

NoHttp使用总结_第3张图片

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

4、异步下载流程图

NoHttp使用总结_第4张图片

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

5、同步下载流程图:

NoHttp使用总结_第5张图片

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

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

NoHttp使用总结_第6张图片

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

NoHttp使用总结_第7张图片

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

(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 request = NoHttp
                    .createStringRequest(url, requestMethod);
            /*
             * what: 当多个请求同时使用同一个OnResponseListener时用来区分请求, 类似handler的what一样
             * request: 请求对象
             *  onResponseListener 回调对象,接受请求结果
             */
            requestQueue.add(1, request, new OnResponseListener() {

                /**
                 * 请求失败的方法
                 */
                @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 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 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() {

            @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 arg1) {
                if (arg0==1) {
                    String string = arg1.get();
                    Log.e("tag", "result==========" + string);
                }
            }
        });

你可能感兴趣的:(数据请求方式的使用)