1.RealCall.execute
java
final class RealCall implements Call {
@Override
public Response execute() throws IOException {
synchronized (this) {
i if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
transmitter.timeoutEnter();
transmitter.callStart();
try {
client.dispatcher().executed(this); //1.调用Dispatcher的executed
return getResponseWithInterceptorChain();//2调用getResponseWithInterceptorChain
} finally {
client.dispatcher().finished(this); //3.结束
}
}
}
1.1.Dispatcher.executed
将call加入runningSyncCalls
java
public final class Dispatcher {
private final Deque<RealCall> runningSyncCalls = new ArrayDeque<>();
synchronized void executed(RealCall call) {
runningSyncCalls.add(call);
}
}
1.2.RealCall.getResponseWithInterceptorChain
执行请求后返回结果
java
final class RealCall implements Call {
Response getResponseWithInterceptorChain() throws IOException {
Interceptor.Chain chain = new RealInterceptorChain(interceptors, transmitter,
null, 0, originalRequest, this, client.connectTimeoutMillis(),
client.readTimeoutMillis(), client.writeTimeoutMillis());
Response response = chain.proceed(originalRequest); //执行拦截器
return response; //返回结果
}
}
1.3.Dispatcher.finished
从runningSyncCalls移除call;
执行下一个call;
java
public final class Dispatcher {
void finished(RealCall call) {
finished(runningSyncCalls, call);
}
private <T> void finished(Deque<T> calls, T call) {
Runnable idleCallback;
synchronized (this) {
//将call从calls移除
if (!calls.remove(call)) throw new AssertionError("Call wasn't in-flight!");
idleCallback = this.idleCallback;
}
boolean isRunning = promoteAndExecute(); //执行下一个call
if (!isRunning && idleCallback != null) {//如果没有要执行的call,调用idleCallback
idleCallback.run();
}
}
}
1.4.总结
- 将RealCall添加到runningSyncCalls
- 调用getResponseWithInterceptorChain执行
- finally里执行
从将RealCall从runningSyncCalls移除
调用promoteAndExecute,执行其他的AsyncCall