**写在前面:本文只是对OKHttp3的简单实用方法介绍,**网络上有很多类似的文章介绍,而且基于OKHttp封装的工具类也有不少,比如:
鸿洋大神的 [Android 一个改善的okHttp封装库]和 [Android OkHttp完全解析 是时候来了解OkHttp了]以及 [Android Https相关完全解析 当OkHttp遇到Https
还有凯子哥的开源项目OkHttpPlus——支持GET、POST、UI线程回调、JSON格式解析、链式调用、文件上传下**
一 、OKHttp简介
OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献(该公司还贡献了Picasso) ,OKHttp用于替代HttpUrlConnection和HttpClient(android API23 6.0里已移除HttpClient,现在代码提示已经画横线了或者直接打不出来)
OkHttp官网地址:https://square.github.io/okhttp/
官网介绍:
OkHttp works on Android 5.0+ (API level 21+) and on Java 8+.
HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP efficiently makes your stuff load faster and saves bandwidth.OkHttp is an HTTP client that’s efficient by default:
- HTTP/2 support allows all requests to the same host to share a socket.
- Connection pooling reduces request latency (if HTTP/2 isn’t available).
- Transparent GZIP shrinks download sizes.
- Response caching avoids the network completely for repeat requests.>
Using OkHttp is easy. Its request/response API is designed with fluent builders and immutability. It supports both synchronous blocking calls and async calls with callbacks.
功能
- get,post请求
- 文件的上传下载
- 加载图片(内部会图片大小自动压缩)
- 支持请求回调,直接返回对象、对象集合
- 支持session的保持
二、 OkHttp3使用
(一)添加OkHttp依赖文件和网络访问权限。
添加网络访问权限
<uses-permission android:name="android.permission.INTERNET"/>
1.创建HTTPClient实例
简单来说,通过OkHttpClient可以发送一个Http请求,并读取该Http请求的响应,它是一个生产Call的工厂。
此外,受益于一个共享的响应缓存/线程池/复用的连接等因素,绝大多数应用使用一个OkHttpClient实例,便可以满足整个应用的Http请求。
三种创建实例的方法:
// 第一种方法:创建一个默认配置OkHttpClient,可以使用默认的构造函数。
OkHttpClient client = new OkHttpClient();
// 第二种方法:通过new OkHttpClient.Builder()方法来一步一步配置一个OkHttpClient实例。
OkHttpClient clientWith30sTimeout = client.Builder()
.readTimeout(30, TimeUnit.SECONDS)
.build();
// 第三种方法: 如果要求使用现有的实例,可以通过newBuilder()方法来进行构造。
OkHttpClient client = client.newBuilder().build();
2.Get请求
2.1同步GET请求
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(url)
.build();
final Call call = okHttpClient.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
Log.d(TAG, "run: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
2.2异步GET请求
//1.创建OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.创建Request对象,设置一个url地址(百度地址),设置请求方式。
Request request = new Request.Builder().url("http://www.baidu.com").method("GET",null).build();
//3.创建一个call对象,参数就是Request请求对象
Call call = okHttpClient.newCall(request);
//4.请求加入调度,重写回调方法
call.enqueue(new Callback() {
//请求失败执行的方法
@Override
public void onFailure(Call call, IOException e) {
}
//请求成功执行的方法
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
注意事项:
- 同步GET请求和异步GET请求基本一样,不同地方是
同步请求调用Call的execute()
方法,而异步请求调用call.enqueue()方法
- 异步调用的回调函数是在子线程,我们不能在子线程更新UI,需要借助于
runOnUiThread()
方法或者Handler
来处理。- 请求成功执行onResponse回调,有一个参数是
response
,
如果我们想获得返回的是字符串,可以通过response.body().string()
获取;
如果希望获得返回的二进制字节数组,则调用response.body().bytes()
;
如果你想拿到返回的inputStream,则调response.body().byteStream()
,