Volley网络框架详解

来源:互联网 发布:蜡烛图分析软件 编辑:程序博客网 时间:2024/05/05 23:49

1、Volley简介
volley是在2013年Google I/O 上发布的网络通信库,它的使用场景:数据量小通信频繁。

2、Volley的优缺点
(1)volley的优点

  • 适合进行数据量小,但通信频繁的网络操作
  • 可以直接在主线程调用服务端并处理返回结果
  • 可以取消请求、容易扩展,面向接口编程
  • 网络请求线程NetworkDispatcher默认开启了4个,可以优化,通过手机CPU数量
  • 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致

(2)volley的缺点
- 底层封装的是httpclient、HttpURLConnection
- 6.0不支持httpclient,如果想支持得添加org.apache.http.legacy.jar
- 不适用于对大文件下载
- 只支持http请求
- 图片加载性能一般

3、Volley的使用
(1)首先需要获取一个RequestQueue对象
(2)创建一个StringRequest对象
(3)将StringRequest对象添加到RequestQueue里面

 //volley第一步        RequestQueue queue = Volley.newRequestQueue(this);        //volley第二步        StringRequest request = new StringRequest("http://ww.baidu.com",                new Response.Listener<String>() {                    @Override                    public void onResponse(String s) {                        Log.e(TAG, "response:" + s);                    }                }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError volleyError) {                Log.e(TAG, "error message:" + volleyError.getMessage());            }        });        //volley第三步        queue.add(request);

总结:通过newRequestQueue(…)函数新建并启动一个请求队列RequestQueue后,只需要往这个RequestQueue不断addRequest即可。
5、volley源码分析
看第一步创建一个RequestQueue对象,这个是实现高并发,看一下newRequestQueue方法是怎么实现的
这里写图片描述
52行,判断第二个参数为null,就会创建一个HTTPClientStack对象,这里做了一个手机版本的判断,当手机版本号大于9的时候就会创建HurlStack,它的内部就是使用HttpUrlConnection,然后会创建一个Network,它是根据传入的stack来处理网络请求的,紧接着在创建好Network之后,会new出一个RequestQueue对象,并调用它的start方法进行启动,然后将这个queue返回,这样这个方法就执行结束了。然后看一下它的start方法执行过程:
这里写图片描述
可以看到他其实创建了一个CacheDispatcher(缓存分发器)实例,然后调用了它的start方法。CacheDispatcher是一个开启子线程的缓存请求队列。然后看这个for循环,在这个循环里,创建了NetworkDispatcher实例,同样调用了它的start方法,NetworkDispatcher其实也是一个开启子线程的网络请求队列。这样Volley的整体框架雏形已经出来了,就是说当它第一次网络请求的时候,会判断数据在我们本地是否有一份,如果有在缓存当中,就直接从缓存中读取,这就加快了读取速度,如果没有才会走NetworkDispatcher从网络中获取数据。当从网络中获取的时候,我们会把数据保存在CacheDispatcher开启的线程里面,这样我们第二次再去获取数据的时候,就速度加快了。这就是Volley加载缓存的一个机制。
然后看一下volley的第三步add方法:
这里写图片描述
这里写图片描述
看239行,它会判断当前请求能否缓存,如果不能缓存,他就会把这个请求添加在了网络请求的队列里面,如果能缓存,就会把它添加在了缓存请求的队列里面。默认情况下每条请求都是可以缓存的。
然后看一下CacheDispatcher内部的实现
这里写图片描述
CacheDispatcher内部是一个线程,既然是一个线程的话,那就看里面最重要的run方法
这里写图片描述
这里写图片描述
在run方法里面开启了一个while死循环,说明这个缓存线程始终是在运行的。100行,它会通过Cache.Entry,它是一个内部类,从缓存队列里获取缓存数据进行判断,如果这entry为null的话就把它添加到网络请求队列里面。

总结:
CacheDispatcher,它首先会从缓存队列里面取出响应结果,如果它为null,我们就把这条请求加入到网络请求队列中,如果不为null的话,我们再判断这个缓存是否过期(109行),如果过期,再把这个请求放到这个请求队列当中。最后我们会调用request.parseNetworkresponse来进行数据的解析,然后将解析出来的数据进行回调了。

然后看一下和CacheDispatcher对应的NetworkDispatcher
这里写图片描述
它内部也是继承了一个Thread线程,它的run方法也是开启了一个while死循环,说明这个网络请求也是在不断的运行的,可以看到在71行,执行了一个performRequest方法,这个方法就是用来发送网络请求的,而Network其实是一个接口,具体实现是在BaseNetwork实现的。当Newwork收到了response的返回值之后,它又会调用parseNetworkResponse来进行Network当中数据的解析,然后它会将数据保存在mCache当中,当然这个方法是交给具体的request来实现的,不同种类的request解析起来是不一样的,常用的request有StringRequest、JsonRequest等等,当这些数据都处理完了之后,会交给一个mDelivery来进行postResponse对解析出来的数据,进行最后的作用。
最后看一下官网给的这张图
这里写图片描述

原创粉丝点击