Android 网络-Volley的框架结构

经典的网络请求例子

典型网络请求
代码模型:
- 用URL生成连接 ;
- 得到输出流(输出流中写入数据) ;
- 得到输入流,获取数据;

遗留下的问题:

  • Android 系统不允许主线程直接操作网络请求,需要在子线程中进行;
    子线程的创建销毁本身就是一种资源消耗,同时线程生命周期不好控制,会导致各种使用问题;
  • 网络异常的处理。请求重连的时候怎么处理,怎样传递错误信息到业务层进行显示,缓存怎么弄,容错机制怎么考虑......需要完善;
  • 每个地方都写同样类似的代码的时候,会出现大量的代码冗余,需要把相同的东西提出来统一处理,再根据业务情况写差异性代码;
  • 代码应该具有向后兼容性,允许不同场景下的定制,或者能够快速稳定的修改/替换内部代码,但是保证业务逻辑的稳定性;
  • 这个时候,我们需要一个网络框架了;

解决问题的思路

  • 频繁的线程创建销毁。
    采用线程池的方式,可以让之前创建的一些线程保存下来,留着之后的请求继续使用;因为线程池中保留了一定量的线程,但是网络请求数量是未知的,那么需要一个队列,保存尚未来得及处理的请求,有空闲线程的时候继续处理;
  • 异常的处理
    网络请求是异步的,很明显的是我们需要定义接口,采用回调的方式,在异常产生的时候丢到业务层;
  • 缓存机制
    对于需要缓存的请求,如果之前已经拉取过数据了,我们就可以直接从本地拿取数据加以显示,不用向服务器要。一种最简单的方式就是将请求数据存下来,同时跟请求数据相关联,根据关联规则存取;
  • 重试机制
    网络请求有时候会遇到重定向,会遇到暂时性质的网络问题。那么我们就需要根据异常原因采取重新连接;
  • 代码复用
    好好的分析一下每一个网络请求,发现它们有太多的相似;比如说都会openConnection ,都会 判断responseCode ,获取 inputstream 等;不同的点上,似乎只有每次请求的URL ,请求参数,请求方式,以及最后的回调处理不一样;我们把相同的代码封装起来,不同的代码,通过参数的方式传递进来就好。
  • 向后兼容性/可扩展性
    很多时候我们这个方面的考虑,都是需要通过接口的方式搞定;一个接口多个实现,能够满足很多的个性化需要以及未来的改造;

看看Volley是怎么做的

Volley流程图.png

** 框架初始化:**

Volley 类提供初始化接口,创建请求管理队列RequestQueue;
RequestQueue中持有全局性的操作对象,跟具体请求无关:
缓存管理接口mCache,负责从磁盘上保存读取之前
网络请求控制类mNetwork ,具体实现单个网络请求的控制类,发起连接,获取原始网络流数据;
缓存分发器mCacheDispatcher ,一个线程类,负责从磁盘读取数据并返回结果;
网络请求分发起mDispatchers ,线程类数据,保存着数个线程,每个网络请求都是在其中一个线程中执行;
事件传递器mDelivery,框架中产生了异常,成功获取数据后都是通过这里回调出去的;
网络请求协议栈HttpStack,接口类,可以采用不同的实现方式获取到http的连接;       

单个网络请求流程:

  以mRequestQueue 的add 方法为入口,传递具体的Requst执行请求流程;
  Requst中包含有网络请求必须的网络设置参数,服务器请求参数,以及回调接口;
  mRequestQueue会根据缓存情况决定是否从Cache中获取数据;               
  不需要缓存数据或者缓存数据过期,请求会进入网络请求队列,经由mDispachters的分发后,从网络获取数据;
  数据获取过程中产生的结果以及异常信息,经由mDelivery回传到request对应的回调中;
  于是一个网络请求过程完成。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • AFHTTPRequestOperationManager 网络传输协议UDP、TCP、Http、Socket、X...
    Carden阅读 4,263评论 0 12
  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 5,127评论 2 54
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,098评论 1 23
  • 1、doctype的意义是什么 2、HTML XHTML HTML5的关系 3、HTML5有什么变化 新的语义...
    9979eb0cd854阅读 173评论 0 1
  • 房间还是原来的模样,一张床,一张桌子,和一个对生活无牵无挂的人。犀利的秋风,吹遍着了这所城市,从南到北。落叶的季节...
    干掉这一碗阅读 454评论 2 9