通过【进阶android】Volley源码分析——Volley的流程、【进阶android】Volley源码分析——Volley的线程以及【进阶android】Volley源码分析——Volley的缓存三篇文章,我们分别从Volley框架的一个总体,两个重点三方面对该框架进行一个全面的分析;一个总体是指对Volley框架的总体流程进行了分析,两个重点是指从Volley框架两个重要的功能——线程、缓存进行了分析。
总体而言,上述三篇文章还是从理论原理的角度上来分析Volley框架;然而理论终究是理论,所以从本章开始,将用两章分析Volley框架中自带的两个工具:StringRequest与ImageLoader。
StringRequest是Volley框架中最简单的一个Request子类;我们在分析其源码之后,会结合该类总结出一个Request对象在Volley框架之中的生命周期。
一、StringRequest工具类
Volley框架对StringRequest的解释是:一个Request的子类,将一个给定URL的response body作为一个字符串处理。Request是一个泛型类,而StringRequest就是一个泛型为String的Request的子类。
StringRequest类中只定义了一个属性:Response.Linstener接口;我们在【进阶android】Volley源码分析——Volley的流程一文中,曾简单提过该接口,知道该接口是网络请求成功监听器(还有一个Response.ErrorLinstener,是网络请求错误监听器)。
同时在【进阶android】Volley源码分析——Volley的线程一文中分析缓存线程时,我们有提过当工作线程(缓存线程或网络线程)在向UI线程传递响应结果后,UI线程会调用Request类中的deliverResponse方法,而deliverResponse方法中一般会调用网络请求成功监听器中的onResponse方法,这个网络请求成功监听器,就是StringRequest之中唯一的一个属性:Response.Linstener。
在分析Request类的时候,曾指出Request的子类会继承Request两个抽象方法,一个是deliverResponse方法,一个是pasreNetWorkResponse方法。
pasreNetWorkResponse方法主要的作用就是将NetworkResponse对象中的原始响应内容解析成Request类中泛型所指定的类的实例,例如StringRequest类中对应的方法则是将原始响应内容(一个byte数组)解析为一个String对象,将byte数组转化为一个String对象,想必大家都知道。
对于Response对象而言,Response的构造方法是private,要向构造一个Response对象,则只能通过Rsponse类的两个静态方法:success和error,前者构造一个请求成功的Response对象,后者构件一个请求失败的Response对象。
以上就是对StringRequest类的全部分析了;源码如下:
public class StringRequest extends Request<String> { private final Listener<String> mListener; /** * Creates a new request with the given method. * 构造器 * @param method the request {@link Method} to use请求方法(get、post等) * @param url URL to fetch the string at请求URL * @param listener Listener to receive the String response网络请求成功监听器 * @param errorListener Error listener, or null to ignore errors网络请求失败监听器 */ public StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener) { super(method, url, errorListener); mListener = listener; } ...... @Override protected void deliverResponse(String response) {mListener.onResponse(response);} @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { String parsed; try { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); } }
二、Request对象的生命周期
结合之前所有的分析,可以得出Request对象的生命周期如下图所示:
根据上图,我们可以把Request按照其生命周期分为:实例、就绪、等待、飞行、响应、结束以及取消七个状态。每个状态Request存在不同,同时每个状态可以互相转化。
- 实例状态:通过Request类及其子类的构造器构造一个Request及其子类的对象,该对象此刻所处的状态。
- 就绪状态:通过RequestQueue类的add方法,将Request对象添加到当前所有请求队列(mCurrentRequests)之中时,该对象所处的状态。
- 等待状态:通过RequestQueue类的add方法,判读出此Request对象对应的URL已经在请求当中,则将其添加到RequestQueue的等待队列(mWaitingRequests)之中时,该对象所处的状态。
- 飞行状态:飞行状态是一个比喻,指请求正在获取响应及解析响应等这一过程;这一过程一般是由工作线程(网络线程及缓存线程)执行。当一个Request对象正在被工作线程执行时,该对象便处于飞行状态之中。
- 响应状态:该状态下的Request对象一般正在被UI线程执行响应回调;一般来说,Request对象的mResponseDelivered变量为true时,该对象所处的状态。
- 结束状态:当该Request对象不处于任何队列之中时,其所处的状态;此状态与实例状态在逻辑上并无不同。
- 取消状态:当Request对象的mCancled变量为true时,其所处的状态;一旦一个Request对象同时拥有取消状态和飞行状态,或者同时拥有取消状态和响应状态时,那么一般这个对象就会不如结束状态。
至此,我们便将Request对象的生命周期分析了;抓住Request对象的生命周期对Volley框架之中一次完整的网络请求流程的理解会有帮助,同时也需要主要Request对象不同状态下的转换。
至此,Volley框架里的StringRequest,我们就分析结束了。
当然由于本人自身水平所限,文章肯定有一些不对的地方,希望大家指出!
愿大家一起进步,谢谢!