每日一题:Volley源码问题分析
面试率: ★★★☆☆
面试提醒
Volley是Google 2013年的I/O大会上volley发布的一个网路框架,主要用于解决通讯频率高,但传输数据量小的情景,虽然现在大部分使用的网络框架要么okHttp,要么retrofit.但是Volley是Google推荐的开源库,在面试中也有不少人会被问到,其中的代码设计,网络架构也是我们开发者可以学习的知识.
面试技巧
Volley是一个非常好拓展的网络框架多用组合,少用继承;针对接口编程,不针对具体实现编程
,可以看出它十分适合我们自定义开发,如:
- 自定义RequestQueue
- 自定义Cache
- 自定义HttpStatck
- 自定义Filter
在实际开发中,随着项目的不断演化,私人订制的功能也慢慢崭露头角,掌握了解并掌握一两种自定义技能也对面试中有较好的帮助.
记住:在面试中可以画图Volley的流程图也是加分的一项哦.
面试题
下面是从Volley中挑选出的几道问题.
你为什么要使用Volley框架,他有什么特点?
Volley 的主要特点
- 扩展性强: Volley 中大多是基于接口的设计,可配置性强。2. 规范性好: 一定程度符合 Http 规范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的处理,请求头的处理,缓存机制的支持等。并支持重试及优先级定义。4. 支持多版本: Android2.3↑ 基于 HttpURLConnection,2.3↓ 基于 HttpClient实现,这两者的区别及优 劣在4.2.1 Volley中具体介绍。5. 功能强大: 提供简便的图片加载工具。
Volley是怎么将请求数据切换到主线程的?
Volley的请求流程
- 根据优先级将请求添加到缓存队列
- 缓存调度线程从缓存队列中取出一个请求
- 请求命中 ->从缓存中读取响应并解析
- 请求丢失 ->网络调度线程从网络队列中取出一个请求
- Http请求传输,解析响应,写缓存
- 最后将解析后的响应传递到主线程
Volley的核心类是什么?
Request,RequestQueue,CacheDispatcher,NetworkDispatcher.
然而RequestQueue是核心,其他三个通过组合的方式围绕着RequestQueue 类.各个功能也都是以接口或者抽象类的方式提供,我们可以通过出自定义,实现更符合我们项目需求的功能.
要注意的是, RequestQueue是Volley 框架的核心类之一,将请求 Request 加入到一个运行的RequestQueue中,来完成请求操作.
多用组合,少用继承;针对接口编程,不针对具体实现编程。
优秀框架的设计,令人叫绝,受益良多。
如果让通过Volley自己封装请求可以吗?
- 我们平时大多采用Volly.newRequestQueue(context)的默认实现,构建 RequestQueue。
- 通过源码可以看出,我们可以抛开 Volley 工具类构建自定义的 RequestQueue,采用自定义的HttpStatck,采用自定义的Network实现,采用自定义的 Cache 实现等来构建RequestQueue。
其实Volley类就是一个工具类而已,
里面组合了HttpStack ->Network,Cache -> RequestQueue
那么我们也可以自己封装一个工具类的.
优秀框架的高可拓展性的魅力来源于此啊.
HttpURLConnection 和 AndroidHttpClient(HttpClient 的封装)如何选择及原因?
- 在 Froyo(2.2) 之前,HttpURLConnection 有个重大 Bug,调用 close() 函数会影响连接池,导致连接复用失效,所以在 Froyo 之前使用 HttpURLConnection 需要关闭 keepAlive。
- 另外在 Gingerbread(2.3) HttpURLConnection 默认开启了 gzip 压缩,提高了 HTTPS 的性能,Ice Cream Sandwich(4.0) HttpURLConnection 支持了请求结果缓存。
- 再加上 HttpURLConnection 本身 API 相对简单,所以对 Android 来说,在 2.3 之后建议使用 HttpURLConnection,之前建议使用 AndroidHttpClient。
什么是请求头?
假设HTTP请求头要求服务端返回一个HTML格式的文件,但服务端强行返回一个json格式的文件,那么用浏览器查看还是报错,查看不了,那么请求头到底有什么用啊,还要受限于服务端.
如:
一些请求状态,要结果码(404,303)
Volley的请求头可以自定义的吗,在哪里自定义?
Volley 如果希望自定义 User-Agent,可在自定义 Request 类中重写 getHeaders() 函数,这个函数的返回值是一个map集合.
Volley支持多少种请求?
Volley 支持 8 种 Http 请求方式 GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE, PATCH.