藏书阁app-网络库选型篇
基本要求
- 支持 HTTP 协议
- 异步请求
可选的网络库
经过整理,可得出以下四个热门网络库都是支持上述两点要求的,接下来一步一步分析各自的特点。
android-async-http
- 通过该库的 Github 的主页我们可以得出以下特点:
- 使用 ThreadPool 调度请求资源,避免了每次请求都要新建线程。
- 支持 Gzip 解压缩
- 早期版本基于 Apache’s HttpClient
- 这是最被人诟病的一点, 因为 Apache’s HttpClient 在 Android 6.0 的 framework 层已经被移除了,现在的版本本质上还是使用 httpClient 的设计。
- 简单使用过可以发现这个库的优点很明显,就是 Api 使用非常简单,是四个库中学习成本最低的一个,如果开发简单的练手项目和 Demo 很适合。但是缺点也很明显,作者已经不再维护这个库了。。 因此不再考虑这个库。
Volley
- 特点:
- 支持取消请求
- 这点可跟 Activity 的生命周期结合起来,当页面不在屏幕上时我们可以试着取消一些无用的请求。
- 支持 http cache
- 可用于减少重复的请求。
- 支持取消请求
- 优点:
- 适合小而频繁的操作,这个特点由以下的设计中体现。
- ByteArrayPool 的重用:这是一个 byte 池,在服务器返回的响应转换成 stream 和 json 之前,都会在这里寻找可以复用的内存空间,避免了每次请求都要重新申请内存,进一步减少了GC次数。
- Request 的合并:在用户发出多次相同的请求时, volley 先在 request queue 中查找是否有相同的,有则合并请求。
- 官网有构建简单的 request 和自定义 request 的详细的教程,减少了开发者的学习成本。
- 适合小而频繁的操作,这个特点由以下的设计中体现。
- 缺点:
- response 的参数是 byte[] 或 text,不提供 Stream 流读取方式,如果需要文件下载功能则需要其他机制的支持。
- 请求的回调内容发生在主线程,在解析 response 时可能会造成主线程阻塞。
- 总结:好处很多,但是对我本身来说,因为之前在别的应用中使用过 volley ,这次想尝试一下别的库,因此不选择该库。
Okhttp
- Android 平台最好的 Http 网络库,选择了 Http协议就选择这个库就没错了~
- 特性:
- 大数据请求
- 对 post 请求封装非常好,通过 resquestbody 简单调用中就可以完成文本、表单、流、文件、分块请求。
- 完善 Http Cache
- 发生默认的http请求,若请求存在本地缓存且未过有效期,使用本地的cache,并不真正发出请求。
- gzip 的自动解压缩
- 只需要告诉服务端接受 gzip 压缩就行,客户端不需要做额外的工作,因为发送的 Http 请求中, okhttp 已经默认为我们加上了 gzip 压缩字段。
- 链路的复用
- 使用 ThreadPool 调度请求资源,避免了每次请求都要新建线程。
- 自定义请求调度
- 我们可以根据网络环境设置并行的请求个数
- 支持请求拦截器
- 收集请求日记信息,不干扰正常业务请求。
- 登录时统一设置用户 token, 不用逐个设置。
- 大数据请求
Retrofit
- 优点:
- 完善的 RESTful 支持。
- 如果 web api 采用的是这个 ,那不用考虑就这个库了。
- 但是如果 web api 用得是一级协议或者二级协议,那么我们获得到 response 后还需要进行二次封装,带来了额外的编码量。
- 提供对 RxJava 的支持
- 完善的 RESTful 支持。
缺点:
- 基于注解实现
- 扩展非常困难,比如说加密信息。
- 依赖 okhttp
- 切换底层库会很困难。。。。
- 切换底层库会很困难。。。。
REST :就是用 URL 定位资源,用 HTTP 描述操作,一种万维网软件架构风格.
RESTful :符合REST设计风格的Web API称为RESTful API。- 基于注解实现
总结:查看豆瓣 developer API 发现就是 Restful 格式的。豆瓣API手册。差点就选择这个库了。。。
总结
最终我选择的是 okhttp,不仅是因为他众多的特性支持,更多的是想锻炼二次封装的能力,并且在之前的网易微专业的课堂中老师也提到。如果选择 retrofit,可能很大功夫都花在熟悉 api 上,要谈二次封装暂时还不够火候。至于 restful 的支持呢,因为考虑到我只是获取豆瓣的图书,没有用到增删查的功能,所以这点特性支持可以忽略不计。
参考资料