文章目录
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
高效稳定、维护成本高
用法:
- 创建 DefaultHttpClient 实例(HttpClient 是接口类)
- 创建 HttpGet/HttpPost 对象 request,传入目标网络地址
- 如果是 HttpPost 对象,还需要通过 setEntity() 方法设置请求参数
- 调用 client 实例的 execute() 方法,传入 request 对象,返回 HttpResponse 对象
- 通过 response 对象的 getStatusLine() 方法再调用 getStatusCode() 获取状态码
- 通过 response 对象的 getEntity() 方法获得 HttpEntity 对象,再通过 EntityUtils.toString() 方法解析返回内容
2、Asynchronous HttpClient
基于 Apache HttpClient
请求在子线程中完成,在请求线程中返回回调
使用了线程池
使用 RequestParams 类封装了请求参数
持久化 cookies 到 SharedPreferences
支持文件上传
支持 json
支持 Http Basic Auth
用法:
- 实例化一个 AsynHttpClient 对象 client
- 编写一个静态 HttpClient 类,封装了 get 和 post 方法
- get/post 方法中分别调用了 client 的 get/post 方法,传入网址和参数,返回 AsyncHttpResponseHandler 回调
- 如果需要保存 cookie,实例化 PersistentCookieStore 类对象 cookieStore,并通过 client 的 setCookieStore() 方法设置
- 或者自己定义一个 BasicClientCookie 对象,通过 setXXX() 方法设置完属性,再通过 cookieStore 的 addCookie() 方法添加
- 最后在回调函数中做状态码和返回内容的处理
3、AFinal
基于 HttpClient(网络层实现为 finalHTTP,是 HttpClient 的再次封装)
开源的 ORM 和 IOC 应用开发框架
小巧灵活、代码入侵量少
4、HttpURLConnection
轻便灵活易扩展
支持 Https、缓存
用法:
- 实例化一个 URL 对象,传入目标网络地址
- 获取 HttpUrlConnection 实例,通过 URL 对象的 openConnection() 方法获取
- 设置 http 请求的连接属性,如 setRequestMethod() 设置请求方法,setConnectTimeout() 设置超时时间
- 通过 getResponseCode() 获取状态码
- 通过 getInputStream() 获取服务器返回的输入流
- 读取内容并解析
- 通过 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 的使用模式上更加保守,在请求清理上也更加积极
用法:
- 创建一个 RequestQueue 对象
- 创建一个 StringRequest 对象,传入网址,响应消息的监听 Listener 和 错误监听 ErrorListener
- 如果是 post 方法,还需要传入方法 Request.Method.POST,并重写 getParams() 方法
- 如果是加载图片,则使用 ImageRequest 来创建 request 对象,传入参数分别为网址、消息监听、图片最大宽度和高度、显示比例、颜色属性、错误监听
- 通过 add() 方法将 StringRequest 对象添加到 RequestQueue 对象中
- 在 onResponse(String response) 回调中处理响应消息或在 onErrorResponse(VolleyError error) 回调中处理错误
还可以使用 ImageLoader 来实现对图片的更多处理,如缓存、过滤,用法:
- 创建一个 RequestQueue 对象
- 创建一个 ImageLoader 对象 loader,传入请求队列、ImageCache 实例化对象
- ImageCache 是接口类,需要具体实现并重载 getBitmap() 和 putBitmap() 方法
- 调用 loader 的 get() 方法加载图片,传入网址和 ImageListener 对象
- ImageListener 对象通过 ImageLoader 的 getImageListener() 方法获取,传入参数为显示图片的 ImageView 对象,加载中和加载失败需要显示的图片资源
- 如果需要对图片大小进行限制,重载 get() 方法即可
自定义 Request,用法:
- 继承自 Volley 的 Request 类,实现构造方法,并重写 parseNetworkResponse 和 deliverResponse 方法
7、OkHttp
Java 的 Http + SPDY 客户端开发包,支持 Android 2.3+
高效,支持 SPDY、连接池、Gzip、Http 缓存
自动处理网络问题,如二次连接、SSL 握手
Android 4.4 开始 HttpURLConnection 底层实现采用 OkHttp
用法:
- 创建一个 OkHttpClient 对象 client
- 创建一个 Request 对象,通过 Request.Builder 的 url()、get()、post() 设置网址、请求方式和参数,通过 build() 方法返回对象
- 调用 client 对象的 newCall() 方法传入 request,然后调用 execute() 执行同步网络请求,或 enqueue() 执行异步请求,并在回调中处理结果
8、Retrofit
性能最好,处理最快
适用于 REST API
传输层默认使用 OkHttp
支持 NIO
默认使用 Gson
用法:
- 将请求地址转为接口,通过注解配置请求头部、方法、参数、返回值等信息
- 创建一个 Retrofit 对象,通过 Retrofit.Builder 的 baseUrl() 等方法设置地址等信息,再通过 build() 返回对象
- 调用 retrofit 对象的 create() 方法返回接口类实例化对象
- 通过接口类调用对应方法,获取 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