android网络请求流程图,Android OKHttp系列1-流程总结
1、 調用示例
同步方式:
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://www.baidu.com").build();
Response response = client.newCall(request).execute();
Log.d(TAG, "response sync:" + response.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
通過追溯源碼,流程圖如下:
image
異步方式:
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://www.baidu.com").build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
Log.d(TAG, "response async:" + response.toString());
}
});
} catch (Exception e) {
e.printStackTrace();
}
通過追溯源碼,流程圖如下:
image
分析
同步和異步請求的核心方法都是getResponseWithInterceptorChain(),需要注意的是,同步方法沒有在工作線程干活,而異步方法是在線程池里面執行,Android不允許在主線程里面做網絡請求操作,如果同步請求的話,還必須在非主線程中。
異步方式請求是執行enqueue方法,有兩個列表維護執行狀態,runningAsyncCalls和readyAsyncCalls,分別是正在執行和等待執行列表,而同步方式則是直接提交請求。異步請求當一次AsyncCall執行完畢之后,在Dispatcher的promoteCalls方法會做兩個狀態列表的切換,等待列表切換到正在執行列表,同時刪除等待列表中最前面的Call。如下:
private void promoteCalls() {
if (runningAsyncCalls.size() >= maxRequests) return; // Already running max capacity.
if (readyAsyncCalls.isEmpty()) return; // No ready calls to promote.
for (Iterator i = readyAsyncCalls.iterator(); i.hasNext(); ) {
AsyncCall call = i.next();
if (runningCallsForHost(call) < maxRequestsPerHost) {
i.remove();
runningAsyncCalls.add(call);
executorService().execute(call);
}
if (runningAsyncCalls.size() >= maxRequests) return; // Reached max capacity.
}
}
遍歷readyAsyncCalls列表里面的call,如果正在運行并小于最大的請求數,就可以加到runningAsyncCalls中了,然后接下來execute執行這個請求。
而promoteCalls方法是被Dispatcher的finished方法執行。RealCall中同步或異步execute方法執行完畢后會在finally中執行client.dispatcher().finished(this)方法,如下:
void finished(AsyncCall call) {
finished(runningAsyncCalls, call, true);
}
/** Used by {@code Call#execute} to signal completion. */
void finished(RealCall call) {
finished(runningSyncCalls, call, false);
}
private void finished(Deque calls, T call, boolean promoteCalls) {
int runningCallsCount;
Runnable idleCallback;
synchronized (this) {
if (!calls.remove(call)) throw new AssertionError("Call wasn't in-flight!");
if (promoteCalls) promoteCalls();
runningCallsCount = runningCallsCount();
idleCallback = this.idleCallback;
}
if (runningCallsCount == 0 && idleCallback != null) {
idleCallback.run();
}
}
第一個是finished異步請求完成之后調用,第二finished是同步請求完成之后調用,最終都會調用到帶泛型參數的finished,并將執行完的call從runningAsyncCalls(異步)或runningSyncCalls(同步)中刪除。promoteCalls參數用來區分是否是異步請求,如果是的話,執行promoteCalls方法。
文章將同步至微信公眾號:Android部落格
總結
以上是生活随笔為你收集整理的android网络请求流程图,Android OKHttp系列1-流程总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android gps定位工具类,工具类
- 下一篇: android地图 demo,Andro