摘要:作为出品的工具还是非常不错的,今天整理一下对他的源码分析,从中能够学到一些。然后在这个对象的接口中启动了个线程来分别进行请求的缓存管理和网络处理。最后将我的分析图奉上,基本上一张图就可以看懂了。
volley作为google出品的工具还是非常不错的,今天整理一下对他的源码分析,从中能够学到一些。
借用网络上的图来表示下请求流程图及类关系图:
类关系图:
从整体关系上看并不是很复杂。下面我就来解读。
整个架构是围绕着RequestQueue开始的,这个对象基本上可以看做是各种容器的集合,其中最重要的是维护了request的请求队列和network处理队列,并且其中还做了缓存用来存放等待的请求。然后在这个对象的start接口中启动了1+n个线程来分别进行请求的缓存管理(CacheDispatcher)和网络处理(NetworkDispatcher)。将各项容器传递进线程对象中,cache线程负责不停的从缓存队列中读取请求,并判定各种条件(包括超时判定,取消判定等),如果符合则传递给网络队列。而network线程也在不断的从网络队列中获取请求,符合条件的开始进行网络请求,并根据返回结果进行缓存,然后通知给调用者。
下面我们从整个框架上看。
首先可以看到,2个线程的流程跟消息甭很类似。为什么要有2个线程来进行这种交换式操作呢?因为提交的请求可能是从任意线程开始的,那么有风险在较短的时间内对网络进行大量频繁的请求,必然导致耗电/cpu和流量的各种不均衡,因此这里做了一个缓冲处理,先提交缓冲,然后利用根据当前机型的cpu计算出的量级开辟的线程池来进行网络的请求;
整个框架扩展性很好,几乎任何的部件都可以扩展。比如cache,可以不使用DiskBasedCache,改为使用内存维护(当然内存开销会增加),或者重写磁盘文件,修正文件格式将所有的头部独立出来维护,实体内容方在多带带的文件中;httpstack也是可以扩展,比如使用其他的开源库来代替现在的方式等,这里就不一一列举了。
使用的支持线程并发的队列PriorityBlockingQueue,同时多线程并发访问时,除了最先的获得访问权的线程外,其他线程阻塞。
为何说volley适合频繁的小的网络请求,不适合大数据的请求呢?这里可以看到volley对请求和返回数据的处理是缓存成文件,但在过程中一次读到内存中,如果是太大的数据,会导致oom。
最后将我的分析图奉上,基本上一张图就可以看懂了。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64834.html
Volley is an HTTP library that makes networking for Android apps easier and most importantly, faster. Volley是Google在2013年推出来的HTTP库,旨在帮助开发者更快更简便的实现网络请求。说说为什么要分析Volley的源码吧,因为Volley中线程的转换时通过 Thread 和 Ha...
阅读 3015·2021-09-03 10:33
阅读 1174·2019-08-30 15:53
阅读 2598·2019-08-30 15:45
阅读 3360·2019-08-30 14:11
阅读 512·2019-08-30 13:55
阅读 2566·2019-08-29 15:24
阅读 1877·2019-08-26 18:26
阅读 3539·2019-08-26 13:41