您的位置:首页 > 理论基础 > 计算机网络

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-HttpVolleyOkhttpRetrofit
作者loopjgooglesquaresquare
时间Android-Async-Http>Volley>Okhttp>Retrofit
使用情况Okhttp>Volley>Retrofit>Android-Async-Http
如何选择网络请求库没有说哪个最好,只有最合适,只有真的了解其使用场景才能很好的选择网络请求库。
下一节将和大家一起详细回顾一下这些火爆的网络库之间的对比和各自的特色。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: