简单使用
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.github.com/search/repositories")
.build();
//执行请求的地方.
client.newCall(request)
.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("MainActivity", response.body().source().readUtf8());
}
});
OkHttpClient
newCall(Request request)
OkHttpClient的newCall(Request request)
方法通过调用RealCall的静态方法newRealCall
来创建一个用于请求的RealCall
@Override public Call newCall(Request request) {
return RealCall.newRealCall(this, request, false /* for web socket */);
}
RealCall和Dispatcher
RealCall是执行请求的类,关键方法有execute()
和enqueue()
Dispatcher是调度器,内部管理线程.
execute()
方法
//RealCall的execute()方法
//关键代码
@Override public Response execute() throws IOException {
... ...
//调用了Dispatcher的execute()方法
client.dispatcher().executed(this);
//调用getResponseWithInterceptorChain()获得Responce
Response result = getResponseWithInterceptorChain();
... ...
}
RealCall的execute()
这是一个同步请求的方法,在方法内部调用了Dispatcher的execute()
方法
//Dispatcher的execute()方法.
//在同步调用的队列里添加一个RealCall
synchronized void executed(RealCall call) {
runningSyncCalls.add(call);
}
Dispatcher的executed(RealCall call)
方法只做了一个向同步调用的队列里添加一个RealCall的操作.最关键的方法是在
Response result = getResponseWithInterceptorChain();
下面来看看RealCall的enqueue()
方法
enqueue()
方法
这是一个异步请求的方法
//RealCall的enqueue()方法
//关键代码
@Override public void enqueue(Callback responseCallback) {
... ...
//调用了Dispatcher的enqueue(AsyncCall call)方法
client.dispatcher().enqueue(new AsyncCall(responseCallback));
}
下面来看看Dispatcher的enqueue(AsyncCall call)
方法
//Dispatcher的enqueue(AsyncCall call)
synchronized void enqueue(AsyncCall call) {
if (runningAsyncCalls.size() < maxRequests && runningCallsForHost(call) < maxRequestsPerHost) {
runningAsyncCalls.add(call);
executorService().execute(call);
} else {
readyAsyncCalls.add(call);
}
}
Dispatcher的enqueue(AsyncCall call)
对请求队列进行了一些判断,来判断是直接执行call还是将call加入readyAsyncCalls
(已经运行异步请求的对列).
然后再来看看 Dispatcher的executorService()
方法.
executorService()
public synchronized ExecutorService executorService() {
if (executorService == null) {
executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));
}
return executorService;
}
executorService()
方法做的就是创建一个executorService
.然后在回过来看Dispatcher的enqueue()
方法
synchronized void enqueue(AsyncCall call) {
... ...
executorService().execute(call);
... ...
}
Dispatcher的enqueue(AsyncCall call)
方法做的最主要的就是用ExecutorService执行AsyncCall,
ExecutorService执行AsyncCall的时候又会调用到AsyncCall的execute()
方法.「ExecutorService是Java多线程的一种使用方式.不懂得可以百度百度…」
下面来看一下AsyncCall的execute()
AsyncCall的execute()
@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);
}
}
一顿分析以后最重要的还是
Response response = getResponseWithInterceptorChain();
最后来看看getResponseWithInterceptorChain()
getResponseWithInterceptorChain()
Response getResponseWithInterceptorChain() throws IOException {
// Build a full stack of interceptors.
List<Interceptor> interceptors = new ArrayList<>();
interceptors.addAll(client.interceptors());
interceptors.add(retryAndFollowUpInterceptor);
interceptors.add(new BridgeInterceptor(client.cookieJar()));
interceptors.add(new CacheInterceptor(client.internalCache()));
interceptors.add(new ConnectInterceptor(client));
if (!forWebSocket) {
interceptors.addAll(client.networkInterceptors());
}
interceptors.add(new CallServerInterceptor(forWebSocket));
Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
originalRequest, this, eventListener, client.connectTimeoutMillis(),
client.readTimeoutMillis(), client.writeTimeoutMillis());
return chain.proceed(originalRequest);
}
getResponseWithInterceptorChain
做的事就是把所有配置好的 Interceptor 放在 一个 List 里,然后作为参数,创建⼀个 RealInterceptorChain 对象,并调用 chain.proceed(request) 来发起请求和获取响应。
Interceptor的工作原理是什么?是怎么工作的? 下回分解.