• 谷歌Volley网络框架讲解——第一篇


    谷歌Volley网络框架讲解——第一篇

     

    自从公司新招了几个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();


    复制代码
     
     
     
     
  • 相关阅读:
    android 选择图片或拍照时旋转了90度问题
    拍照选择图片(Activity底部弹出)
    Dialog 自定义使用1
    Dialog 基本使用
    秒杀主流应用的二维码扫描
    gen already exists but is not a source folder. Convert to a source folder or rename it.
    gen already exists but is not a source folder. Convert to a source folder or rename it.
    Unable to execute dex: Multiple dex files define
    xxxx is not translated in zh-rCN, zh-rTW
    Android Application 对象介绍
  • 原文地址:https://www.cnblogs.com/wlh652475101/p/3483306.html
Copyright © 2020-2023  润新知