Volley详解(二)——请求(Request)
来源:互联网 发布:mac不需要杀毒软件 编辑:程序博客网 时间:2024/05/19 05:39
概述
本篇介绍请求相关的类,主要包括Request<T>
和RequestQueue
两部分。
Part 1 ——Request
成员变量
Request<T>
的主要属性如下:
int mMethod
:请求的类型,即GET、POST、PUT等String mUrl
:请求的urlString mIdentifier
:请求的唯一标识Response.ErrorListener mErrorListener
:用于错误处理的回调接口,是Response
的静态内部类Integer mSequence
:记录请求到达的先后顺序RequestQueue mRequestQueue
:所在在请求队列boolean mShouldCache
:请求结果是否需要缓存boolean mCanceled
:请求是否被取消了boolean mResponseDelivered
:请求结果是否已处理Cache.Entry mCacheEntry
:缓存,用于检验缓存一致性
多数属性都比较容易理解,其他的只是列出,会在后续博客逐步涉及。
构造函数
Request
类有两个重载的构造函数,而且很简单:
public Request(String url, Response.ErrorListener listener);public Request(int method, String url, Response.ErrorListener listener);
必须提供的是url和ErrorListener,method如果没有,默认值是GET。另外,只有错误处理接口ErrorListener是放在Request类中的,而正常情况下的响应处理接口是放在子类中的,这体现了框架的扩展性。
抽象方法
有两个子类必须重写的抽象方法:
abstract protected Response<T>parseNetworkResponse(NetworkResponse response);
将原始的网络请求的返回结果转化为客户端需要的类型<T>
,该方法会在工作线程中被调用,如果该方法返回null,则后续的deliverResponse()
将不会执行。
abstract protected void deliverResponse(T response);
将返回的结果交给相应的Listener
处理,如果前一阶段parseNetworkResponse()
失败,则该方法不会被调用。
其他重要方法
另外还有两个重要方法,与请求参数有关,子类如果要用到请求参数,则需要重写这两个方法。
protected Map<String, String> getParams();
该方法返回由请求参数key-value pair组成的Map
,Request
类中并没有表示参数的属性,因此,子类如果使用请求参数,直接重写该方法,令其返回一个存储了参数的Map
即可。
public byte[] getBody();
返回byte[]
格式的请求请求参数,默认情况下会调用getParams()
,然后将请求的键值对以key=value&key=value
的形式连接起来。
Request的子类
Request<T>
是个抽象类,必须继承后才能使用,Volley已经给出了三种实现:StringRequest
,JsonRequest
,ImageRequest
,而JsonRequest
也是抽象类,它有JsonObjectRequest
和JsonArrayRequest
两个子类。
StringRequest
属性
在基类的基础上,增加了响应回调接口Response.Listener mListener
。方法
只重写了两个抽象方法parseNetworkResponse()
,将网络请求原始结果的body
部分转化为String
并返回。deliverResponse()
,调用mListener.onResponse(response)
处理结果。
JsonRequest
基本原理与StringRequest
相同,不同的是增加了对请求参数的支持。 Volley
中并没有RequestParams
这样表示参数的类,所以在JsonRequest中,请求体是用String
或JsonObject
表示的。
- 如果用
String
,则是key=value&key=value
的形式; - 如果用
JsonObject
,则请求体的键值对即为JsonObject的键值对。
以上两种形式的请求体在两个子类JsonObjectRequest
和JsonArrayRequest
的构造函数中都可以使用。
ImageRequest
与前面两个子类相比,大体思路相同,但增加了很多调整图片尺寸的代码。构造函数如下:
public ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight, ScaleType scaleType, Config decodeConfig, Response.ErrorListener errorListener);
可以通过maxWidth
、maxHeight
以及scaleType
参数控制返回的Bitmap
的大小。
注意到一个细节,对于Bitmap
类,在parseNetworkResponse()
函数中需要调用BitmapFactory.decodeByteArray()
获取Bitmap
,改方法很消耗内存,所以设计者给该方法进行了加锁处理,保证同时只进行一个parseNetworkResponse()
操作。
Part 2 ——RequestQueue
存储各种状态下的Request
,并负责启动工作线程,是Volley
的枢纽。
Request的集合
维护了4个集合,用于表示各种状态下的Request:
PriorityBlockingQueue<Request<?>> mCacheQueue
:
缓存请求队列PriorityBlockingQueue<Request<?>> mNetworkQueue
:
网络请求队列Set<Request<?>> mCurrentRequests
:
正在执行中的网络请求,文档中用了“in flight”这个词,很贴切Map<String, Queue<Request<?>>> mWaitingRequests
:
等待请求的集合,如果一个请求正在被处理(即in flight)并且可以被缓存,则后续的具有相同url的请求,将进入此等待队列,该Map
的键是Request
的cacheKey
,默认为mMethod + mUrl
。
工作类
维护了其他几个核心类的引用,调度框架的整体工作:
Cache mCache
:缓存类Network mNetwork
:网络请求类NetworkDispatcher[] mDispatchers
:网络分发线程CacheDispatcher mCacheDispatcher
:缓存分发线程ResponseDelivery mDelivery
:处理请求结果的接口
add()
方法
public <T> Request<T> add(Request<T> request);
将一个Request
添加到RequestQueue
,具体工作如下:
- 将
Request
添加到mCurrentRequest
中,防止同一个请求被重复执行。 - 判断该请求是否需要缓存,如果不需要,直接将其加入
mNetworkQueue
并return
,等待网络分发线程处理。 - 在
mWaitingRequests
中查找该Request
的cacheKey
,如果找到,转4,否则,转5。 - 说明有相同的请求已经被发出,不需要重新发起网络请求。只需加入
mWaitingRequests
即可,即将Request
加入到cacheKey
对应的Queue
中。 - 说明该请求没有在执行中,需要发起网络请求。一方面,将
Request
加入到mCacheQueue
,等待缓存分发线程处理;另一方面,在mWaitingRequests
添加键值对<chcheKey, null>
,表示改请求已在处理中,后续到达的具有相同cacheKey
的请求不必重复发起。
其他方法
start()
用于启动RequestQueue
,该方法会初始化CacheDispatcher
和所有的NetworkDispatcher
并启动它们,工作线程会从相应的队列中循环不断地取出Request
并执行。Volley.newRequestQueue()
方法中会调用start()
,所以此时就不需要我们手动调用start()
了。stop()
该方法会使所有的工作线程退出。finish(Request<T> request)
表示该请求已处理完毕,从mRequestQueue
中移除。
- Volley详解(二)——请求(Request)
- volley(2)——自定义request
- Android Volley详解(三) 自定义Request
- HttpClient详解(二)—请求详解
- Volley简单学习使用二——Request
- Android网络通信必备神器Volley详解——实现一个自定义的Request(以Gson为例)
- javaweb基础学习(二)<request和response详解,以及请求中的乱码问题>
- Volley请求网络数据,设置图片(二)
- 利用volley进行http设置请求头(二)
- Android学习之网络请求(volley)二
- 详解用户登录流程——Volley 请求
- Volley的基本使用(1)——http请求
- Volley(1)—发送get和post请求
- Android-Volley网络通信框架(自定义Request 请求:实现 GsonRequest)
- volley请求数据(二)
- Volley以及自定义Request详解
- 初识Volley(二)
- Volley(二)
- 迷宫问题 POJ 3984 【BFS】
- hdoj.5099 Comparison of Android versions【字符串处理,水题】 2015/08/13
- zoj 2833 Friendship(并查集)
- UIGestureRecognizer手势识别
- Ofbiz 入门介绍
- Volley详解(二)——请求(Request)
- NSOperationQueue
- 编写代码与测试的结合
- Receiver not registered.
- Ubuntu下安装npm以及常见错误情况解决
- xheditor 与strut2 配置使用并提供上传图片!
- C++中关于时间的处理问题
- js分割字符串
- C/C++:内存字节对齐详解