Okhttp 应该是Android目前非常流行的第三方网络库,尝试讲解他的使用以及原理分析,分成几个部分:
- Okhttp同步和异步使用
- 同步和异步流程
- Dispatcher
- 拦截器
- 缓存
- 连接池复用
OKHttp的使用
OKHttp支持同步请求和异步请求
- 同步请求
OkHttpClient mClient = new OkHttpClient.Builder().build();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.get()
.build();
Call call = mClient.newCall(request);
Response response = call.execute();
- 异步请求
OkHttpClient mClient = new OkHttpClient.Builder().build();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.get()
.build();
Call call = mClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.e(TAG, "onResponse: " + response.body().string() );
}
});
这里只是很简单的使用了OKHttp去get请求,分别用了同步请求和异步请求。
前面的流程基本是一样的,构造OkHttpClient实例,构造一个Request表示Http的Request请求,再生成Call请求;
最后根据是同步还是异步,决定是直接在当前线程执行execute(),还是 enqueue()加入dispacter待执行队列。
注意enqueue()的回调并不是在主线程。如果需要切换线程的话可能需要借助Handler。
Request 和 Call 分不清两者的分别,既然有了Request为什么需要Call;
- Request 表示Http的Request请求,用来封装网络请求信息及请求体,跟Response相对应;
- Response 表示Http的Response响应,用来封装网络响应信息和响应体;
- Call 表示请求执行器,负责发起网络请求;
同步和异步流程
1.同步请求
Response response = call.execute();
call是一个接口,由RealCall实现:
//RealCall
public Response execute() throws IOException {
synchronized (this) {
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
captureCallStackTrace();
timeout.enter();
eventListener.callStart(this);
try {
// dispatcher加入执行队列
client.dispatcher().executed(this);
// 拦截器责任链:真正执行请求、处理结果
Response result = getResponseWithInterceptorChain();
if (result == null) throw new IOException("Canceled");
return result;
} catch (IOException e) {
e = timeoutExit(e);
eventListener