OkHttp ——适用于 Android 和 Java 应用程序的 HTTP, HTTP/2 的客户端
OkHttp 是一个处理网络请求轻量级框架,是一个精巧的网络请求库。
有如下特性:
- 支持 HTTP2 / SPDY( SPDY 是 Google 开发的基于 TCP 的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。)
- socket 自动选择最好路线,并支持自动重连,拥有自动维护的 socket 连接池,减少握手次数,减少了请求延迟,共享 Socket , 减少对服务器的请求次数。
- 基于 Headers 的缓存策略减少重复的网络请求。
- 拥有 Interceptors 轻松处理请求与响应(自动处理 GZip 压缩)。
功能:
- Get, Post, Put, Delete 请求。
- 文件的上传下载。
- 加载图片(内部会图片大小自动压缩)
- 支持请求回调,直接返回对象、对象集合
- 支持 session 的保持
它的请求/响应使用构造器模式来设计,支持阻塞式的同步请求和带回调的异步请求。
OkHttp 3.12.x 版本支持Android 2.3(API level 9)和 Java 7 以上的版本。
使用 OkHttp
1. 依赖与权限
在项目的 build.gradle 中添加 OkHttp 依赖
dependencies {
...
api 'com.squareup.okhttp3:okhttp:3.12.0'
}
在 AndroidManifest.xml 中增加网络权限。
<uses-permission android:name="android.permission.INTERNET" />
2. 异步 POST 发送 json 数据请求
下面是一个参考DEMO。
通过异步 POST json 数据异步请求服务器返回。
public class FaceRecognizer {
private static String mUrl = "http://192.168.1.200:8001/get_license";
private static final OkHttpClient sHttpClient = new OkHttpClient();
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public void recognize_async(String key_msg) {
JSONObject json = new JSONObject();
try {
json.put("public_key", key_msg);
} catch (JSONException e) {
Log.e(TAG, "recognize: ", e);
return;
}
RequestBody body = RequestBody.create(JSON, json.toString());
Request request = new Request.Builder()
.url(mUrl)
.post(body)
.build();
// 异步 enqueue
sHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 处理错误信息
}
@Override
public void onResponse(Call call, Response response) throws IOException {
ResponseBody body = response.body();
if (body != null) {
// 处理从服务器获取到的信息
}
response.close();
}
});
}
}
主要参数和字段的说明如下:
参数 | 说明 | 备注 |
---|---|---|
MediaType | 传递数据的 MIME 类型,包含 type、subtype、charset(字符集) 。常用有 json(application/json)、xml(application/xml)、png(image/png)等。 | Media Type 参考 |
OkhttpClient | OkHttp 对外的 API,包含很多功能模块 | |
Request | 代表一个 Http 请求。一但创建将不可修改,需要使用 Builder 模式进行构造 | |
Request.Builder().post | Http 请求采用 POST | 不使用时默认为 GET 请求 |
enqueue | 异步请求,将请求放入队列中处理。返回时会更加情况回调 onFailure 或 onResponse 接口 |
3. 同步 GET 发送请求
public void recognize_sync() {
Request request = new Request.Builder()
.url(mUrl)
.get() // 默认 GET 请求,可以不添加
.build();
// 同步 execute
final Call call = okHttpClient.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
ResponseBody body = response.body();
if (body != null) {
// 处理从服务器获取到的信息
}
response.close();
} catch (IOException e) {
// 处理错误信息
}
}
}).start();
}
由于同步请求会阻塞线程,而 Android 后续规定在主线程不允许进行网络阻塞。
所以想要运行同步请求,需要在其它线程内运行。
总结
自此,可以简单使用 OkHttp 实现 GET / POST 异步和同步的网络请求了。
需要注意的是,OkHttpClient 对象最好共享(建议使用单例模式创建)。
因为每个 OkHttpClient 开销较大(有自己的线程池和连接池),重复创建容易爆内存。
如果还需要使用如 DELETE、文件上传下载等,可以查询 官方网站 和 Java接口说明文档
网友评论