自从公司新招了几个android工程师后,我清闲了些许。于是就可以有时间写写博客,研究一些没来的研究的东西。

今年的谷歌IO大会上,谷歌推出了自己的网络框架——Volley。不久前就听说了但是没有clone下来,这次终于把源码弄下来了。

这个框架对网络请求数据缓存做了很多优化,其他说明就请自行百度吧。。。

在这梳理一下网络请求的过程:

先看一段网络请求的代码吧

mQueue = Volley.newRequestQueue(getApplicationContext());
//StringRequest四个构造参数分别是Request类型,url,网络请求响应监听器,错误监听器
mQueue.add(new StringRequest(Method.GET, "http://www.baidu.com/", new Listener<String>(){ @Override
public void onResponse(String arg0) {
// TODO Auto-generated method stub
Log.e("onResponse", arg0);
} }, new ErrorListener(){ @Override
public void onErrorResponse(VolleyError arg0) {
// TODO Auto-generated method stub
Log.e("onErrorResponse", arg0.toString());
} }));
mQueue.start();

Volley

首先,通过Volley的静态方法new一个请求队列,再调用请求队列(RequestQueue是由缓存和网络线程构造的)的start方法。

然后,得到一个RequestQueue请求队列时,就添加一个请求Request,Volley提供有三种请求的封装,一个是StringRequest,一个事ImageRequest,还有一个是JsonRequest。

最后,调用RequestQueue的start方法就可以开始一条网络请求了。

可以看出Volley只是RequestQueue的一个helper。

RequestQueue

所以,这里一个最核心的就是RequestQueue请求队列这个了。

这个请求队列是有两个东西完成,一个是cache一个network。

这个RequestQueue的构造形式有四种:除了上面这两个还有线程池数量,响应委派。

1,public RequestQueue(Cache cache, Network network, int threadPoolSize,ResponseDelivery delivery)

2, public RequestQueue(Cache cache, Network network, int threadPoolSize)

3,public RequestQueue(Cache cache, Network network)

其实Cache和Network真正的工作者还是CacheDispatcher缓存调度和NetworkDispatcher网络调度。下期再详细讲解Dispatcher。。

RequestQueue的成员方法主要有下面几个:

public void start();//请求队列开始进行调度发vgm

public void stop();//队列退出调度

public Request add(Request request);//添加一个请求,通过调用start()来执行

void finish(Request request);//这个方法应该是释放请求资源的方法

public void cancelAll();//取消当前的请求

NetworkDispatcher

这个就是网络调度的核心,这是一个继承Thread的类,构造方法如下

public NetworkDispatcher(BlockingQueue<Request> queue,Network network, Cache cache,ResponseDelivery delivery)

一个Request的队列,Network ,Cache ,ResponseDelivery 。。。

它的run()方法就是把请求队列取出一个Request,让Network 去执行一次请求再通过ResponseDelivery 进行解析。

Network

/**
* An interface for performing requests.
* 这是执行一个请求的接口
*/
public interface Network {
/**
* Performs the specified request.
* @param request Request to process
* @return A {@link NetworkResponse} with data and caching metadata; will never be null
* @throws VolleyError on errors
*/
public NetworkResponse performRequest(Request<?> request) throws VolleyError;
}

这是一个接口,执行请求获取响应,一个是NetworkResponse 一个是Request。

Request

它的构造方法:

public Request(int method, String url, Response.ErrorListener listener)

第一个method就是请求类型,包括get,put,post,delete;第二个就是请求的url咯,第三个是ErrorListener。

subclass有StringRequest,ImageRequest,JsonObjectRequest,JsonArrayRequest。

1.StringRequest是继承Request<String> ,对应String的ResponseListener交付请求结果。

public StringRequest(int method, String url, Listener<String> listener,ErrorListener errorListener)

2.JsonRequest有JsonObjectRequest和JsonArrayRequest两个子类,通过parseNetworkResponse(NetworkResponse response)来处理JsonObject和JsonArray两个不同结果。

3.ImageRequest的构造参数比较多,主要针对图片的一些处理工作。多了一个限制图片最大长宽和configOptions图片类的东西。

public ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,Config decodeConfig, Response.ErrorListener errorListener)

Response

Request有个 把NetworkResponse 解析成 Response<T> 的抽象方法。

abstract protected Response<T> parseNetworkResponse(NetworkResponse response);

然后调用Response.Listener<T>的接口返回String,Json或bitmap。最后得到了想要的东西就可以随便怎么处理了。

Response有两个接口,一个是Listener回调期望内容的接口和一个ErrorListener接口。

/** Callback interface for delivering parsed responses. */
public interface Listener<T> {
/** Called when a response is received. */
public void onResponse(T response);
}
onResponse()把想要的json或者string,bitmap数据传回来
/** Callback interface for delivering error responses. */
public interface ErrorListener {
/**
* Callback method that an error has been occurred with the
* provided error code and optional user-readable message.
*/
public void onErrorResponse(VolleyError error);
}
onErrorResponse会返回一个VolleyError 的错误,可以根据这些error进行响应的处理。
 

VolleyError

这个类继承Exception,用来捕获各宗异常。

在NetworkDispatcher里有个处理异常的方法parseAndDeliverNetworkErrorRequest<?> request, VolleyError error();

在请求的过程中把各种异常抛出,然后通过Response的ErrorListener捕获异常进行处理。

整个过程差不多就是这样,梳理一番就很清楚,不过谷歌的代码就是很神,比其他网络上哪些炒来炒去的框架质量好不少,层次分明结构清晰,看着都赏心悦目。

我们再回过头来看一下这个请求方法的使用,就很清楚了。

 mQueue = Volley.newRequestQueue(getApplicationContext());
//StringRequest四个构造参数分别是Request类型,url,网络请求响应监听器,错误监听器
mQueue.add(new StringRequest(Method.GET, "http://www.baidu.com/", new Listener<String>(){ @Override
public void onResponse(String arg0) {
// TODO Auto-generated method stub
Log.e("onResponse", arg0);
} }, new ErrorListener(){ @Override
public void onErrorResponse(VolleyError arg0) {
// TODO Auto-generated method stub
Log.e("onErrorResponse", arg0.toString());
} }));
mQueue.start();

好了今天就到这,下班回家。。。

谷歌Volley网络框架讲解——第一篇的更多相关文章

  1. 谷歌Volley网络框架讲解——BasicNetwork类

    谷歌Volley网络框架讲解——BasicNetwork类 这个类是toolbox工具箱包里的,实现了Network接口. 先来看下Network这个interface,performRequest( ...

  2. 谷歌Volley网络框架讲解——HttpStack及其实现类

    前两篇已经对网络请求流程已经梳理了个大概,这次我们着重看一下HttpStack和它的其实现类.我们之前在Network篇讲过它仅有一个实现类,而今天我们讲的HttpStack有两个实现类. 其中Htt ...

  3. 谷歌Volley网络框架讲解——网络枢纽

    研究了这么久的Volley,愈来愈发现这个框架的精美和人性化.比起民间一些框架强很多,一开始总是盲人摸象找不到头绪,现在终于有些明朗了.Volley其实就是一个请求队列的代理类,我们看下UML. 这就 ...

  4. 谷歌Volley网络框架讲解——Network及其实现类

    我们看到Network接口只有一个实现类BasicNetwork,而HttpStack有两个实现类. BasicNetwork这个类是toolbox工具箱包里的,实现了Network接口. 先来看下N ...

  5. Android开源框架Afinal第一篇——揭开圣女的面纱

    Android开源框架Afinal第一篇——揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在 ...

  6. Windows系统CPU内存网络性能统计第一篇 内存

    最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存使用情况以及网络流量.现在将其整理一下(共有三篇),希望对大家有所帮助. 目录如下: 1.<Wind ...

  7. Volley网络框架完全解析(使用篇)

    在Android中,网络请求无非就这两种:HttpURLConnection和HttpClient( Apache),我们在使用时一般都会对它们进行一系列的封装,但是这过程不免有些繁琐,所以,Goog ...

  8. Volley网络框架的使用

    Volley的特点:   使用网络通信更快.更简单 Get/Post网络请求网络图像的高效率异步请求 可以对网络请求的优先级进行排序处理 可以进行网络请求的缓存 可以取消多级别请求 可以和Activi ...

  9. Volley网络框架完全解析(缓存篇)

    在上一篇中讲完了Volley框架怎么使用,那么这篇就来讲讲Volley框架的缓存机制 我们看Volley内部源码发现: Volley框架内部自己处理了DiskBasedCache硬盘缓存,但是没有处理 ...

随机推荐

  1. Java NIO使用及原理分析(三)(转)

    在上一篇文章中介绍了缓冲区内部对于状态变化的跟踪机制,而对于NIO中缓冲区来说,还有很多的内容值的学习,如缓冲区的分片与数据共享,只读缓冲区等.在本文中我们来看一下缓冲区一些更细节的内容. 缓冲区的分 ...

  2. else好像必须做点什么,可以省点资源不做什么吗,else下不能用pass

    portfolio = [ {'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', 'shares': 50, 'price': ...

  3. yum-plugin-priroites这个插件的一个文件。

    yum源优先级的一个文件.是yum-plugin-priroites这个插件的一个文件.用来给yum源分优先级的.比如你在centos下有centos,epel,rpmfusion三个yum源.三个y ...

  4. OC基础--常用类的初步介绍与简单实用之集合类

    集合类的异同点 一.NSArray\NSMutableArray *有序 *快速创建(只有不可变数组可以):@[obj1, obj2, obj3]; *快速访问元素:数组名[i] *只能存放对象 二. ...

  5. web工程jar包问题

    JRE System Library主要存放J2SE的标准jar,一般不需要调整. Referenced Libraries是存放第三方的jar包,也就是自己导入的jar包.在项目属性的Java Bu ...

  6. webBrowser1.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整【转】

    在做数据采集时,有些网站需要输入验证码,但各网站验证码都不同,不可能有完美的识别验证码的代码,所以我也没去研究,我所采取的方案是:在winform里通过WebBrowser调用网页先手动登录系统,然后 ...

  7. CentOS7.2内核版本查看简述

    1.uname 命令 [root@bogon /]# uname --help 用法:uname [选项]... 输出一组系统信息.如果不跟随选项,则视为只附加-s 选项.   -a, --all以如 ...

  8. 【Java面试题】47 heap和stack有什么区别

    java的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个 ...

  9. 【Java面试题】4 静态变量和实例变量的区别?详细解析

    在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加.在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量.静态变 ...

  10. 关于Bundle

    1. 黄色的文件夹,打包的时候,不会建立目录,主要保存程序文件 - 素材不允许重名 2. 蓝色的文件夹,打包的时候,会建立目录,可以分目录的存储素材文件 - 素材可以重名 - 游戏的场景,backgr ...