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 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);
}
}
});