位置: 编程技术 - 正文

Volley 源码解析(veth pair源码)

编辑:rootadmin

推荐整理分享Volley 源码解析(veth pair源码),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:volley源码解析,lvgl源码解析,vite源码解析,viewmodel源码解析,veth pair源码,wolive源码,volley源码解析,volley源码解析,内容如对您有帮助,希望把文章链接给更多的朋友!

原文连接, 转载请注明作者和原文连接(@woaitqs woaitqs.github.io)

为什么需要阅读Volley的源码

Volley是Google在年推出的一个网络库,用于解决复杂网络环境下网络请求问题。「Google出品,必属精品」,而且Volley被使用在包括「Google Plus」的一系列Google产品中,久经考验。因此我们通过学习Volley的源代码,可以学得很多Android网络处理方面的知识,同时可以看看Google 在设计Volley体系结构的时候,所使用的技巧。

Volley组件化的设计

设计良好的组件,在实现层面上也一定是组件完备的。通过一些基础组件的拼接,来架构起一些伟大的功能。

对于网络请求而已,相应大多数人,在设计之初开始,会想到外界输入一个网络请求,通过回调的方式给调用相应的反馈就可以了,遵循这样的设计思路下去,在顶向下地设计就会有一个架构设计,但如果出现一些需求的变动,这样的架构能否在较小代价的情况下来满足需求的变动呢?另一方面,如果我们试着自底向上地展开设计了?

开始先想想对于网络库而已,我们需要什么样的组件。「网络」(负责通过URL和参数来从网络中请求数据),「缓存」(将数据缓存下来,并提供接口供外界请求),「请求」(对请求的封装,比如参数,方法,优先级等),「响应」(对结果的封装),「错误」(请求过程中发生的问题)。这些Volley提出的实现是「Network.java」,「Cache.java」,「Request.java」,「Response.java」,「VolleyError.java」,现在有了这些基础组件后,还剩下2个工作:

为这些定义的组件提供实现。尽可能地为这些组件提供一个统一的入口. 「外观模式」

在下面的章节里面,来逐个分析每个组件,最后看看Volley是如何把这些组件联系在一起的。

Compoment [NetWork]

这里的结构十分明晰,从接收Request输入到提供NetworkResponse输出,在发生异常的时候,抛出VolleyError。这里是对网络请求进行的封装,这与普通的网络请求不一样,因而Volley提供了另一个组件HttpStack

可以看出来,Network是针对HttpStack进行的包装,Volley实现了2种HttpStack,分别针对2.3以下和4.0以上系统。在2.3系统的时候,还没有UrlConnection, 因此用HttpClient来代替。原因可以参考这里

无论是HttpClientStack还是HUrlStack都是对request.getMethod()里面的几乎所有方法,包括PUT,POST,DELETE,GET四种RestFul风格的。这里指出这个,是想提醒调用者除了Get和POST外,还有其他方法可以调用,同时RestFul风格的API正得到广泛认可。Restful 风格把一切都当做资源,提供增,删,改,查四种方式,Volley是对Restful风格进行了良好的支持。调用方可以通过对Volley进行封装可以实现一个RestFul的RPC client。

再来看看Network的实现BasicNetwork,里面有许多值得学习的地方:

对etag,和 lastModified 的支持。当我们把一个Response缓存下来的时候,服务端可能返回Etag和lastModified,服务端通过这两个值就可以判断这个请求是否可以命中服务端的缓存,从而可以加快返回的速度。处理 NOT_MODIFIED 的情况。当服务端返回的时候,即表示命中了缓存,在这里就不需要再走返回Response的步骤了,直接使用Cache中的数据就可以了。在实现上面,是通过Mock的一个NetworkResponse来实现的。获取 Response Contents 的数据。如果responseContents使用了3态,亦即通过null,空和有数据来表示三种状态,这是一种很有意思的编程技巧。重点在于entityToBytes方法。 这个方法里面使用了一个字节池,来避免我们每次allocate 一个字节数组的开销。

再来看看ByteArrayPool是如何实现的,其实原理很简单,就是用空间来换取性能,避免OOM。在实现上面是使用了「惰性添加」的方式,最大限度的避免在不调用Volley的时候的开销,但也可以根据实际需求,先new出来一个字节数组。

Volley 源码解析(veth pair源码)

核心方法是如下2个,分别是 getBuf 和 returnBuf

Compoment [Cache]

现在看看Volley是如何实现Cache的,后面再接着分析其他几个组件。Cache里面的核心组件是Entry,这个类封装了Cache的一些细节知识,简单看看。

在Cache提供的接口里面,除了put和get方法外,还有一个方法是initialize 方法,这个在CacheDispatcher启动的时候,会去执行。这里相当于给各种Cache策略,提供了一种在初始化的时候的Hook,通过这个Hook可以实现复杂的策略。

Volley提供了2种cache方式,一是NoCache,而是DiskBasedCache,NoCache比较简单,重点看看DiskBasedCache。 DiskBasedCache 提供了 get 和 remove 方法,便于写入和读取。文件级别的Cache默认最大大小为5M,在初始化的时候,会把内存中的Cache读入到内存中,通过LinkedHashMap来实现。

Compoment [Request]

Request 相当于整个Volley系统的输入,通过Request,建立起与内部系统沟通的桥梁,因此Request的设计至关重要。我们来分析下,Request是如何与内部系统建立沟通的。

如何让Volley知道,我需要什么样的数据。

首先Request是支持泛型的,通过这个泛型来定义Request需要什么样的数据,同时volley 提供了这样的方法,来指定调用方如何通过response 来变成自己想要的数据。

如何让系统知道我需要优先执行我的任务。Volley通过 Priority 这个来判断优先级,在实际执行里面,是通过 PriorityBlockingQueue 来实现优先级高的队列来执行。如何让 Volley 知道我要怎么去执行任务

这个是最根本的需求,调用方可以通过url,method等内容与Volley进行交互,传递参数通过getParams()来实现的。这样实现的一个好处在于可以把一些校验逻辑放在子类里面,子类里面可以校验参数是否合法,如果不合法,则抛出AuthFailureError异常。

如何让 Volley 知道我想进行一些操作

目前volley仅支持 Cancel 操作,当用户想取消某个 request 的时候,实际上是设置了一个标志位,Volley 通过这个标志位来进行判断,以决定后续的操作。

Compoment [Request 和 Error]

Response 和 Error 就是Volley 对调用方的输出,在经历对调用方屏蔽内部细节过后,将Response 告诉调用者。Error 就是对 Exception 的简单封装,这里也就不细细描述了。

Volley 是如何整理各个组件的Volley 的体型结构

在Volley 的结构里面,组件都已经定义完毕了,剩下的工作就是如何把这些组件以合适的方式组合起来,供调用者使用。

RequestQueue的外观模式

RequestQueue 封装了 Request 队列的一系列操作,理论上用户知道RequestQueue就足够了,通过这个队列来进行任务的添加和取消,当Request 结束的时候,给调用者相应的回调即可。

CacheDispatcher & NetworkDispatcher 的操作

仔细想想,Volley 其实是一个生产者和消费者系统,调用方是生产者,而Volley是消费者。调用方通过RequestQueue 生产Request,而Vollery 消费Request 从而得到Response。那么负责调配这些生产者和消费者的就是Dispatcher,分别是Cache 和 Network 的Dispatcher。

Dispatcher 在实现上,其实比较简单。首先Dispatcher是Thread,线程的Run方法里面,是一个While循环,Run方法在开始的时候,会去读取Request,读取不到会一直Block在哪里;在读取完成后,就开始走相应的逻辑,比如写入缓存或者从网络中读取数据。

android图文列表 privateHandlergetJsonHandler=newHandler(){publicvoidhandleMessage(android.os.Messagemsg){StringjsonData=(String)msg.obj;System.out.println(jsonData);try{JSONArrayjsonArray=newJSONArray(jsonData);Log.i

[置顶] Android自定义动画类——实现3D旋转动画 Android中的补间动画分为下面几种:(1)AlphaAnimation:透明度改变的动画。(2)ScaleAnimation:大小缩放的动画。(3)TranslateAnimation:位移变化的动画。(4)Ro

Android学习之路(六)之 Activity的生命周期 Activity的生命周期一个Activity从被创建到被销毁都有一定的过程,这样的过程我们称之为Activity的生命周期。对于Activity的生命周期,有这样一个图来描述

标签: veth pair源码

本文链接地址:https://www.jiuchutong.com/biancheng/371072.html 转载请保留说明!

上一篇:xUtils 源码解析(istio源码解析)

下一篇:android图文列表(android图片布局)

  • 车辆购置税退税申请模板
  • 商贸企业出口进项税会计分录汇总
  • 建筑企业开票都开什么
  • 定额发票可以用旧的营业执照发票章吗
  • 支付残保金分录怎么写
  • 支付宝过路费开票小程序
  • 土地增值税清算是什么意思
  • 视同销售不开票如何计算增值税?
  • 增值税一般计税方法
  • 全年累积盈利交所得税吗?
  • 材料亏损怎么做会计分录?
  • 给客户现金回款怎么写
  • 所税税汇算补交上一年度税金如何做账务处理?
  • 合伙企业可以弥补以前年度亏损吗
  • 建筑工程属于开票项目吗
  • 建筑企业在工程所在地全额征收
  • 税务清算审计需要多久
  • 小规模纳税人一个季度多少免税
  • 个人年终奖如何交税
  • 洒水车属于免税车辆吗?
  • 收取会员费收入会计分录
  • 房产企业开发产品出租
  • 无法支付的其他应付款可以用现金核销吗
  • 建安企业增值税税率是多少
  • 参加抽奖活动中奖却不发奖品
  • 金税盘全额抵扣分录怎么做
  • 超标的业务招待费属于什么差异
  • 即期结售汇期限包括
  • php生成php文件
  • 会计账簿登记错误怎么办
  • 购入无形资产的增值税税率
  • 什么是工资薪金所得
  • phpinclude
  • 资产负债表是不是根据记账凭证生成的
  • 专票抵扣联可以盖两个章吗
  • 查看ls命令的使用手册
  • 苹果响应机制
  • 汽车维修费可以做差旅费吗
  • asp.net mvc图片上传
  • 收款金额比开票金额多怎么处理
  • 电子税务局实名核验失败
  • 如何编制试算平衡表图示
  • 印花税是必交的吗
  • 承包费会计处理
  • 估价入帐能跨年吗
  • 开具电费发票如何入账?
  • 房地产企业帐套设置
  • 非税收入专用票据包括什么
  • 收入支出结余怎么记账
  • 长期股权投资的交易费用计入哪里
  • 贷款利息天数怎么算的
  • 半个固定资产如何折旧
  • 提高sql执行效率的方法
  • winpe如何使用
  • 通过zeno实现加速屏幕显示操作教程
  • bios如何设置关机键开机
  • windows任务管理器怎么用
  • win2016 ntp
  • win7 系统设置
  • 如何设置windows启动密码
  • mac电脑系统安装
  • diskgenius_winpe文件夹能删吗
  • win7桌面图标变成了lnk
  • linux进程和线程底层实现原理一样吗
  • win7 64位系统使用百度影音播放视频没声音没画面的故障原因及解决方法
  • windows默认程序设置
  • win7注册表修改锁屏时间
  • win10局域网无法上网
  • Unity5 Assetbundle简单使用 及 打包Material文件超大的问题
  • es6 文档
  • vim多行匹配
  • ExtJS中设置下拉列表框不可编辑的方法
  • 很不错的成语
  • js插件写法
  • linux生成文件
  • ztree getnodebytid
  • transformer可视化
  • androidmvvm框架
  • 杨柳青还迁房2024年还建不建
  • 广州市电子税务局怎样跨区申报税务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设