-
}
-
});
第二步:代码流程分析:
Request request = new Request.Builder().url("url").build();
初始化构建者模式和请求对象,并且用URL替换Web套接字URL。
-
public final class Request {
-
public Builder() {
-
this.method = "GET";
-
this.headers = new Headers.Builder();
-
}
-
public Builder url(String url) {
-
......
-
// Silently replace web socket URLs with HTTP URLs.
-
if (url.regionMatches(true, 0, "ws:", 0, 3)) {
-
url = "http:" + url.substring(3);
-
} else if (url.regionMatches(true, 0, "wss:", 0, 4)) {
-
url = "https:" + url.substring(4);
-
}
-
HttpUrl parsed = HttpUrl.parse(url);
-
......
-
return url(parsed);
-
}
-
public Request build() {
-
......
-
return new Request(this);
-
}
-
}
第三步:方法解析:
-
okHttpClient.newCall(request).enqueue(new Callback() {
-
@Override
-
public void onFailure(Call call, IOException e) {
-
}
-
@Override
-
public void onResponse(Call call, Response response) throws IOException {
-
}
-
});
源码分析:
-
public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.Factory {
-
@Override
-
public Call newCall(Request request) {
-
return new RealCall(this, request, false /* for web socket */);
-
}
-
}
RealCall实现了Call.Factory接口创建了一个RealCall的实例,而RealCall是Call接口的实现。
异步请求的执行流程
-
final class RealCall implements Call {
-
@Override
-
public void enqueue(Callback responseCallback) {
-
synchronized (this) {
-
if (executed) throw new IllegalStateException("Already Executed");
-
executed = true;
-
}
-
captureCallStackTrace();
-
client.dispatcher().enqueue(new AsyncCall(responseCallback));
-
}
-
}
由以上源码得知:
1) 检查这个 call 是否已经被执行了,每个 call 只能被执行一次,如果想要一个完全一样的 call,可以利用 call#clone 方法进行克隆。
2)利用 client.dispatcher().enqueue(this) 来进行实际执行,dispatcher 是刚才看到的 OkHttpClient.Builder 的成员之一
3)AsyncCall是RealCall的一个内部类并且继承NamedRunnable,那么首先看NamedRunnable类是什么样的,如下:
-
public abstract class NamedRunnable implements Runnable {
-
......
-
@Override
-
public final void run() {
-
......
-
try {
-
execute();
-
}
-
......
-
}
-
p