OkHttp基本原理浅析
我们先来看下OkHttp的两个使用方法
同步:
//同步执行方法,不应该在UI线程使用
response = client.newCall(request).execute();
//异步方法
response = client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
}
});
让我们进入newCall一探究竟~
/**
* Prepares the {@code request} to be executed at some * point in the future.
*/
@Override public Call newCall(Request request) {
return RealCall.newRealCall(this, request, false /* for web socket */);
}
static RealCall newRealCall(OkHttpClient client, Request originalRequest, boolean forWebSocket) {
// Safely publish the Call instance to the EventListener.
RealCall call = new RealCall(client, originalRequest, forWebSocket);
call.eventListener = client.eventListenerFactory().create(call);
return call;
}
可以看到返回了一个RealCall对象,接下来继续看RealCall是个什么东西,主要看他的 execute和enqueue方法
@Override protected void execute() {
boolean signalledCallback = false;
try {
Response response = getResponseWithInterceptorChain();
if (retryAndFollowUpInterceptor.isCanceled()) {
signalledCallback = true;
responseCallback.onFailure(RealCall.this, new IOException("Canceled"));
} else {
signalledCallback = true;
responseCallback.onResponse(RealCall.this, response);
}
} catch (IOException e) {
if (signalledCallback) {
// Do not signal the callback twice!
Platform.get().log(INFO, "Callback failure for " + toLoggableString(), e);
} else {
eventListener.callFailed(RealCall.this, e);
responseCallback.onFailure(RealCall.this, e);
}
} finally {
client.dispatcher().finished(this);
}
}
}
由此可见execute确实是执行在调用它的线程里面的,看代码应该是通过getResponseWithInterceptorChain()来具体执行的,看到了似曾相识的interceptor,其实这里是运用了责任链设计模式的拦截器,这个稍后再说 execute方法暂时先告一段落,接下来看enqueue
@Override