花了很长时间才做写完这个帖子 希望我写的文章能够让你对Volley有一定的了解 这样我的目的就达到了
先简单介绍一下Volley的诞生背景 Volley诞生于 2013年 Google I/O大会上 是Google开发工程师写的一个网络请求框架 特点是进行数据量不大,但通讯频繁的网络操作,内部还封装了图片加载的控件 NetworkImageView 用于直接在网络上面加载图片 本文只是对 RequestQueue requestQueue = Volley.newRequestQueue(context);这一行代码的深入理解 别小看这一行代码 这一行代码信息量很大的 废话不多说 我们就直接来阅读源码吧(Read The Fucking Source Code)
当我们用Volley执行网络请求时 首先就会写这一行代码

点进去之后 代码如下(class volley)


这个类里面主要是看几行代码
我们调用的是一个参数的构造方法 但是他还是会去掉两个参数的构造方法 两个参数的构造方法 看下面这一行代码
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network); 这里new了一个RequestQueue 的对象
这一行代码第一个参数告诉我们的信息是
1.new DiskBasedCache(cacheDir) 字面的意思是基于磁盘的缓存 里面的参数我们可以在volley类里看到 如下:
private static final String DEFAULT_CACHE_DIR = "volley";
File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
这两行代码的意思是在项目data/data包下创建一个volley的文件夹
然后再看一下DiskBasedCache类的实现的一些细节 点开之后我们发现DiskBasedCache类里面的代码行数五百多行 我们还是挑重点看

点开他的构造方法可以看到是给成员变量赋值 我们重点看参数二 参数二我们可以明显看到了一个数 那就是规定默认磁盘缓存的大小时5M
所以我们在创建一个请求队列时 第一个参数得到的结论是 1.volley文件夹是在这里创建的,2. 磁盘缓存的大小时5M,看到这里我们大致了解了一些基本信息
我们接着往下看 创建请求队列时的第二个参数是什么意思 :
network 点进去之后

这就是一个接口 通过注释了解到 主要是由他来执行网络请求的 那么他是怎样执行网络请求的呢 我们接着往下看
点到BasicNetwork类里面看到 (由于源码比较多 我们就看这一行代码)

是通过这一行来执行网络请求的
回过头来 我们再来看volley类代码
Network network = new BasicNetwork(stack);
这一行代码参数的好像在哪里见过 没错就是默认给我们传过来的值就是null 这行代码的上面 有一个判断

这里给stack赋值了 如果版本大于9 的话 stack = new HurlStack();点到HurlStack类里面看到

这个方法我们可以看到底层是通过HttpURLConnecttion来完成网络请求的
如果版本小于9 的话用的是HttpClient来执行网络请求的
总结:从创建一个请求队列我们可以看到以下几点:
1.volley文件夹是在这里创建的,2. 磁盘缓存的大小时5M,3.底层执行网络请求所用的框架 说了半天现在也是在说RequestQueue后面的两个参数的意思 我们接着往下看RequestQuene的源码
RequestQuene 类里面也就三百多行代码 这里我们就看跳过来的代码

进去之后看到了一个常量 DEFAULT_NETWORK_THREAD_POOL_SIZE 这里我们可以看到 默认的网络线程池的大小为四
这里的线程池可以优化 这里可以看到volley里的线程池是由数组组成 并且默认的线程数为四个
还可以看到第四个参数new ExecutorDelivery(new Handler(Looper.getMainLooper()))) 这里使用hander绑定一个主线程的looper 来完成线程的之间的切换的
总结:RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);我们写的这一行代码 volley帮我们做了

我们接着往下看 看volley源码知道 现在该启动这个队列了
queue.start(); 这一行代码又做了什么呢

这里是先开启了一个缓存的分发器 mCacheQueue, mNetworkQueue, mCache, mDelivery 有四个参数 第三个和第四个参数是在创建队列的时候调用
第一和第二个参数是在RequestQueue类里面已经初始化好了 这两个队列的意思是首先看缓存队列里面有没有请求 有的话就直接用 没有的话 就放在网络队列里
点到CacheDispatcher里面可以看到这是一个线程 他的run方法是一个死循环
再来看start方法 里面有一个for循环 mDispatchers.length的值 我们已经知道是四了 意思是创建四个网络分发器
所以我们start方法里一次性启动了五条线程
以上这些内容就是我们在创建一个请求队列时volley帮我们做的所有事情 也就是开篇讲的mRequestQueue = Volley.newRequestQueue(context);做的事情
网友评论