美文网首页
Volley源码分析

Volley源码分析

作者: _warren | 来源:发表于2017-07-11 22:44 被阅读0次

    volley中的所有请求都是抽象类Request的具体实现类

    public abstract class Request implements Comparable<Request<T>>{  

    // 实现Comparable接口的意义是在于当请求队列中的数量较多时,就需要按优先级或者是先进先出的方式依次发送请求

        private static finalStringDEFAULT_PARAMS_ENCODING="UTF-8";  // Put和Post的请求参数的默认编码

    }

    Volley支持的请求用接口定义以下九个常量过时的DEPRECATED_GET_OR_POST,Get,Post,Put,Delete,Head,Options,Trace,Patch

    public interface Method{

      int DEPRECATED_GET_OR_POST= -1;  // 过时的Get或者Post请求

      int GET=0;

      int POST=1;

      int PUT=2;

      int DELETE=3;

      int HEAD=4;

      int OPTIONS=5;

      int TRACE=6;

      int PATCH=7;

    }

    Request中有几个重要的final修饰的成员变量

    private finalStringmUrl;  // 请求的Url地址

    private finalResponse.ErrorListenermErrorListener;  // 错误监听器

    private RequestQueue mRequestQueue; // 与该请求相关的请求队列

    private boolean mShouldCache=true; // 这次请求是否应该被缓存下来

    private boolean mCanceled=false; // 该请求的状态是否变成已取消

    private boolean mResponseDelivered=false; // 该请求的响应是否已经被分发出去

    private boolean mShouldRetryServerErrors=false; // 该服务器的错误是否应该被再次审核

    private Cache.Entry mCacheEntry=null; // 从缓存中取出的请求必须要保证已经在网络中刷新过,并且缓存的对象需要用该变量存下来,为了防止发生响应没有被修改,换句话说也就是确保最新的响应

    Request的构造函数

    public Request(String url,Response.ErrorListener listener) {  // 已经过时的构造方法

        this(Method.DEPRECATED_GET_OR_POST,url,listener);

    }

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

        mMethod=method;

        mUrl=url;

        mErrorListener=listener;

        setRetryPolicy(newDefaultRetryPolicy()); // 设置默认的重试策略

        mDefaultTrafficStatsTag=findDefaultTrafficStatsTag(url);

    }

    Request中重要的方法 终止该请求(将请求从队列中移除)

    void finish(final String tag) {

      if(mRequestQueue!=null) {

           mRequestQueue.finish(this);  // 队列将该请求移除出去

       }

    if(MarkerLog.ENABLED) {

        final longthreadId=Thread.currentThread().getId();

        if(Looper.myLooper()!=Looper.getMainLooper()) {

       // If we finish marking off of the main thread, we need to

        // actually do it on the main thread to ensure correct ordering.

        Handler mainThread=new Handler(Looper.getMainLooper());

            mainThread.post(newRunnable() {

                @Override

                public void run() {

                   mEventLog.add(tag,threadId); 

                   mEventLog.finish(this.toString()); 

              }

          });

         return;

        }

         mEventLog.add(tag,threadId);

        mEventLog.finish(this.toString());

       }

     }

    将参数写成字节码

    publicStringgetBodyContentType() {

        return"application/x-www-form-urlencoded; charset="+getParamsEncoding();

    }

    public byte[] getBody() throwsAuthFailureError{

        Map params=getParams();

        if(params!=null&¶ms.size()>0) {

             return encodeParameters(params,getParamsEncoding());

        }

        return null;

      }

    将参数编码拼接在URL中

    private byte[]encodeParameters(Mapparams,StringparamsEncoding) {

       StringBuilderencodedParams=newStringBuilder();

      try{

       for(Map.Entryentry:params.entrySet()) {

            encodedParams.append(URLEncoder.encode(entry.getKey(),paramsEncoding));

            encodedParams.append('=');

            encodedParams.append(URLEncoder.encode(entry.getValue(),paramsEncoding));

            encodedParams.append('&');

       }

           return encodedParams.toString().getBytes(paramsEncoding);

       }catch(UnsupportedEncodingExceptionuee) {

           throw newRuntimeException("Encoding not supported: "+paramsEncoding,uee);

      }

    }

    Request的子类可以重写该方法,可以针对跟精确的错误类型做相应的处理

    protected VolleyError parseNetworkError(VolleyError volleyError) {

      return  volleyError;

    }

    子类必须重写该方法去解析原生的响应结果,返回一个恰当的响应结果

    abstract protected Response<T>  parseNetworkResponse(NetworkResponseresponse);

    子类必须实现该方法,分发解析过后的响应给那些监听回调,这个响应的参数必须保证不为空,响应解析失败将不会支持分发操作

    abstract protected void deliverResponse(T response);

    分发错误给ErrorListener监听回调

    public voiddeliverError(VolleyErrorerror) {

       if(mErrorListener!=null) {

          mErrorListener.onErrorResponse(error);

        }

    }

    相关文章

      网友评论

          本文标题:Volley源码分析

          本文链接:https://www.haomeiwen.com/subject/ggtvhxtx.html