Android网络库的前世今生四个阶段
2017-01-17 20:18
218 查看
前言
网络请求模块在Android中应用十分广泛,可以说它起到举足轻重的作用,一个封装良好的网络请求模块会对app的体验和性能带来意想不到的效果。前世今生
那么Android利用 HTTP 协议来访问网络资源在历史的演变中,都经历了哪些具有代表性的阶段呢?1. HttpURLConnection:在 JDK 的 java.net 包中提供了访问 HTTP 协议的基本功能,即HttpURLConnection,它是Java的标准类,继承自URLConnection,可用于向指定网站发送GET请求、POST请求。在Android2.2之前,HttpURLConnection 有个重大 Bug,调用 close() 函数会影响连接池,导致连接复用失效。HttpURLConnection在URLConnection的基础上提供了如下方法:
- int getResponseCode():获取服务器的响应代码。
- String getResponseMessage():获取服务器的响应消息。
- String getResponseMethod():获取发送请求的方法。
- void setRequestMethod(String method):设置发送请求的方法。
一般情况下,如果只是需要Web站点的某个简单页面提交请求并获取服务器响应,以上方法完全可以胜任。但在绝大部分情况下,Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面。在这种情况下,就需要涉及Session、Cookie的处理了,这时候使用HttpURLConnection来处理这些细节,就显得有些难度略大,因此Http网络请求框架步入了第二阶段。
2. HttpClient: 为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。但不会缓存服务器的响应,不能执行HTML页面中嵌入的JavaScript代码;也不会对页面内容进行任何解析、处理。它是一个增强版的HttpURLConnection,关注于如何发送请求、接收响应,以及管理HTTP连接。那么如何使用它来发起网络请求呢?
- 创建HttpClient对象。
- 如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
- 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
- 调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
- 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
对于上面提出的问题:访问Web应用中被保护的页面,使用浏览器则十分简单,用户通过系统提供的登录页面登录系统,浏览器会负责维护与服务器之间的Sesion,如果用户登录的用户名、密码符合要求,就可以访问被保护资源了。在Android应用程序中,则可使用HttpClient来登录系统,只要应用程序使用同一个HttpClient发送请求,HttpClient会自动维护与服务器之间的Session状态,也就是说程序第一次使用HttpClient登录系统后,接下来使用HttpClient即可访问被保护页而了。
有句话说的话,历史的车轮是不断向前的,我们发现在App和服务器进行网络交互时存在如下问题:
- 异步请求
- 线程池
- 缓存
鉴于以上的特点,网络框架呈现出了百花齐放的第三个阶段,很多开源网络库相继的走入大家的视线,其中以Android-Async-Http、Volley、OkHttp最为火爆。
3. 网络请求框架:本质上是将网络请求的相关方法( HttpClient或HttpURLConnection)封装好的类库,并实现另开线程进行请求和处理数据,从而实现整个网络请求模块的功能。
- Android-Async-Http:android-async-http是一个强大的网络请求库,这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。源码地址Lhttps://github.com/loopj/android-async-http
- Volley:2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。源码地址:https://developer.android.com/training/volley/index.html
- OkHttp:OkHttp 是 Square 公司出品的 HTTP 另一个请求库, Google 不推荐人们使用 HttpClient, 可是 HttpURLConnection 实在是太难用了, 因此很多人使用了 OkHttp 来解决这问题, 据说 Android4.4 的源码中可以看到 HttpURLConnection 已经替换成 OkHttp 实现源码地址:https://github.com/square/okhttp
上述就是常见的网络库,但是他们都存在一个问题应用层在接入的时候,每个请求中都有很多大量重复代码,为了解决上述问题,网络库发展到了如今的第四个阶段
4. 很多个人对开源网络库的封装渐渐的被大家认知和在项目中使用,尤其以Retrofit最为备受青睐。
- Retrofit:Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,其主要作者是Android大神JakeWharton,源码地址:https://github.com/square/retrofit
5. 网络库的发展时间轴线图:
网络请求库 | Android-Async-Http | Volley | Okhttp | Retrofit |
---|---|---|---|---|
作者 | loopj | square | square | |
时间 | Android-Async-Http>Volley>Okhttp>Retrofit | |||
使用情况 | Okhttp>Volley>Retrofit>Android-Async-Http | |||
如何选择 | 网络请求库没有说哪个最好,只有最合适,只有真的了解其使用场景才能很好的选择网络请求库。 |
相关文章推荐
- 专家系统/模糊理论/神经网络/遗传算法相关基础知识
- 线性规划与网络流24
- linux配置网络
- (OS 64)指定的网络名不再可用,winnt_accept: Asynchronous AcceptEx failed.
- retrofit+okhttp 实现缓存
- 高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少
- MFC实现下载网络图片缓存到本地
- HttpSession 常使用的方法与实现登录
- 第四章 TCP粘包/拆包问题的解决之道---4.1---
- 分布式网络爬虫功能模块组成
- QT---基于WinPcap的局域网络管理工具(主机扫描、包过滤、ARP攻击、端口扫描)
- Http协议入门:
- Linux模拟复杂网络环境下的传输(netem和tc)
- Android网络定位或GPS定位
- Java web项目 在线网络考试修改考套题部分代码
- libevent http post json 测试
- TCP三次握手
- OC基础之可循环滚动并突出中间图片,并且可点击
- http协议之Transfer-Encoding
- tomcat使用https链接