【进阶android】Volley源码分析——Volley的工具【StringRequest】

            通过【进阶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,我们就分析结束了。

当然由于本人自身水平所限,文章肯定有一些不对的地方,希望大家指出!

愿大家一起进步,谢谢!

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值