一、OkHttp介绍
1.这个库的作用:
网络底层库,它是基于 http 协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向真正的请求,跟 HttpClient, HttpUrlConnection 的职责是一样的。其中封装了网络请求 get、post 等底层操作的实现。
2.项目中使用这个库的原因(优点)
- OkHttp 提供了对最新的 HTTP 协议版本 HTTP/2 和 SPDY的支持,这使得对同一个主机发出的所有请求都可以共享相同的套接字连接。
- 如果 HTTP/2 和 SPDY 不可用,OkHttp 会使用连接池来复用连接以提高效率。
- OkHttp 提供了对 GZIP 的默认支持来降低传输内容的大小。
- OkHttp 也提供了对 HTTP 响应的缓存机制,可以避免不必要的网络请求
- 当网络出现问题时,OkHttp 会自动重试一个主机的多个 IP 地址。
二、简单使用步骤
1.导入库
implementation("com.squareup.okhttp3:okhttp:3.10.0")
2.步骤
- 1.先创建 OkHttpClient 实例;
- 2.构造 Request 实例,传入 url 等相关参数;
- 3.通过前两步中的实例对象构建 Call 对象;
- 4.异步请求通过 Call#enqueue(Callback) 方法来提交异步请求,同步请求通过 Call#execute() 直接 获取Reponse
相应代码如下
//1.创建⼀个 OkHttp 的实例
OkHttpClient client = new OkHttpClient.Builder().build();
//2.创建 Request
Request request = new Request.Builder().url("http://www.jimengjia.com").build();
//3.构建 Call 对象
Call call=okHttpClient.newCall(request);
//4.通过 Call#enqueue(Callback) 方法来提交异步请求
call.enqueue(new Callback() {
@Override
public void onFailure( Call call, IOException e) {
}
@Override
public void onResponse( Call call,Response response) throws IOException {
}
});
3.源码解析
看源码的流程(思想):
1.从使用步骤中第四步可以看出起关键作用的是enqueue(),所以从源码中找到此方法开始分析。
代码如下:
@Override public void enqueue(Callback responseCallback) {
synchronized (this) {
//每个请求只能执行一次
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
captureCallStackTrace();
eventListener.callStart(this);
//进入下一个主线
client.dispatcher().enqueue(new AsyncCall(responseCallback));
}
2.从上述代码可以看到,创建了一个 AsyncCall 并将Callback传入后,最后交给了任务分发器 Dispatcher 来进一步处理。
client.dispatcher().enqueue(new AsyncCall(responseCallback)); 进入下一个调用dispatch