Android 网络框架初探

0x01 Android 上的网络框架

Android一路走来的网络框架变更【网络协议:HTTP】

  • Android 2.2-:HttpClient
  • Android 2.3+:HttpURLConnection
  • Android 3.0:HttpURLConnection 增加了对 HTTPS 的支持
  • Android 4.0:HttpURLConnection 增加了对缓存的支持
  • Android 4.4+:HttpURLConnectio 底层引入OkHttp框架
  • Android 5.0+:OkHttp

在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。

1、HttpClient

高效稳定、维护成本高

用法:

  1. 创建 DefaultHttpClient 实例(HttpClient 是接口类)
  2. 创建 HttpGet/HttpPost 对象 request,传入目标网络地址
  3. 如果是 HttpPost 对象,还需要通过 setEntity() 方法设置请求参数
  4. 调用 client 实例的 execute() 方法,传入 request 对象,返回 HttpResponse 对象
  5. 通过 response 对象的 getStatusLine() 方法再调用 getStatusCode() 获取状态码
  6. 通过 response 对象的 getEntity() 方法获得 HttpEntity 对象,再通过 EntityUtils.toString() 方法解析返回内容
2、Asynchronous HttpClient

基于 Apache HttpClient

请求在子线程中完成,在请求线程中返回回调

使用了线程池

使用 RequestParams 类封装了请求参数

持久化 cookies 到 SharedPreferences

支持文件上传

支持 json

支持 Http Basic Auth

用法:

  1. 实例化一个 AsynHttpClient 对象 client
  2. 编写一个静态 HttpClient 类,封装了 get 和 post 方法
  3. get/post 方法中分别调用了 client 的 get/post 方法,传入网址和参数,返回 AsyncHttpResponseHandler 回调
  4. 如果需要保存 cookie,实例化 PersistentCookieStore 类对象 cookieStore,并通过 client 的 setCookieStore() 方法设置
  5. 或者自己定义一个 BasicClientCookie 对象,通过 setXXX() 方法设置完属性,再通过 cookieStore 的 addCookie() 方法添加
  6. 最后在回调函数中做状态码和返回内容的处理
3、AFinal

基于 HttpClient(网络层实现为 finalHTTP,是 HttpClient 的再次封装)

开源的 ORM 和 IOC 应用开发框架

小巧灵活、代码入侵量少

4、HttpURLConnection

轻便灵活易扩展

支持 Https、缓存

用法:

  1. 实例化一个 URL 对象,传入目标网络地址
  2. 获取 HttpUrlConnection 实例,通过 URL 对象的 openConnection() 方法获取
  3. 设置 http 请求的连接属性,如 setRequestMethod() 设置请求方法,setConnectTimeout() 设置超时时间
  4. 通过 getResponseCode() 获取状态码
  5. 通过 getInputStream() 获取服务器返回的输入流
  6. 读取内容并解析
  7. 通过 disconnect() 方法关闭当前连接

注意添加网络访问权限

5、xUtils

3.0- 基于 HttpClient,3.0+ 基于 HttpURLConnection

基于 Afinal 开发的,目前功能比较完善的开源框架

6、Volley

Android 开发团队2013年推出的一个网络通信框架,Android 2.2- 使用 HttpClient, Android 2.3+ 使用 HttpURLConnection

通信封装,支持加载图片,性能优化,适合数据量不大、通信频繁的网络

优势在于处理小文件的 Http 请求

支持处理高分辨率的图像压缩

支持使用 Okhttp 作为传输层

NetworkImageView 在 GC 的使用模式上更加保守,在请求清理上也更加积极

用法:

  1. 创建一个 RequestQueue 对象
  2. 创建一个 StringRequest 对象,传入网址,响应消息的监听 Listener 和 错误监听 ErrorListener
  3. 如果是 post 方法,还需要传入方法 Request.Method.POST,并重写 getParams() 方法
  4. 如果是加载图片,则使用 ImageRequest 来创建 request 对象,传入参数分别为网址、消息监听、图片最大宽度和高度、显示比例、颜色属性、错误监听
  5. 通过 add() 方法将 StringRequest 对象添加到 RequestQueue 对象中
  6. 在 onResponse(String response) 回调中处理响应消息或在 onErrorResponse(VolleyError error) 回调中处理错误

还可以使用 ImageLoader 来实现对图片的更多处理,如缓存、过滤,用法:

  1. 创建一个 RequestQueue 对象
  2. 创建一个 ImageLoader 对象 loader,传入请求队列、ImageCache 实例化对象
  3. ImageCache 是接口类,需要具体实现并重载 getBitmap() 和 putBitmap() 方法
  4. 调用 loader 的 get() 方法加载图片,传入网址和 ImageListener 对象
  5. ImageListener 对象通过 ImageLoader 的 getImageListener() 方法获取,传入参数为显示图片的 ImageView 对象,加载中和加载失败需要显示的图片资源
  6. 如果需要对图片大小进行限制,重载 get() 方法即可

自定义 Request,用法:

  1. 继承自 Volley 的 Request 类,实现构造方法,并重写 parseNetworkResponse 和 deliverResponse 方法
7、OkHttp

Java 的 Http + SPDY 客户端开发包,支持 Android 2.3+

高效,支持 SPDY、连接池、Gzip、Http 缓存

自动处理网络问题,如二次连接、SSL 握手

Android 4.4 开始 HttpURLConnection 底层实现采用 OkHttp

用法:

  1. 创建一个 OkHttpClient 对象 client
  2. 创建一个 Request 对象,通过 Request.Builder 的 url()、get()、post() 设置网址、请求方式和参数,通过 build() 方法返回对象
  3. 调用 client 对象的 newCall() 方法传入 request,然后调用 execute() 执行同步网络请求,或 enqueue() 执行异步请求,并在回调中处理结果
8、Retrofit

性能最好,处理最快

适用于 REST API

传输层默认使用 OkHttp

支持 NIO

默认使用 Gson

用法:

  1. 将请求地址转为接口,通过注解配置请求头部、方法、参数、返回值等信息
  2. 创建一个 Retrofit 对象,通过 Retrofit.Builder 的 baseUrl() 等方法设置地址等信息,再通过 build() 返回对象
  3. 调用 retrofit 对象的 create() 方法返回接口类实例化对象
  4. 通过接口类调用对应方法,获取 Call 实例,调用 Call 对象的 execute() 或 enqueue() 执行同步或异步网络请求

0x02 Android 8.1 的网络框架

Android 8.1 使用的网络框架为 HttpURLConnection,其底层实现依赖于 OkHttp

一个典型的 HttpURLConnection 网络请求过程为:

HttpURLConnection connection = null;
InputStream inputStream = null;

try {
   
		// 1. 实例化一个 URL 对象,传入目标网络地址
    URL url = new URL(urlPath);
    // 2. 通过 URL 对象的 openConnection() 方法获取 HttpUrlConnection 实例
    connection = (HttpURLConnection) url.openConnection();

		// 3. 设置 http 请求的连接属性
    connection.setRequestMethod("GET");
    connection
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值