OKHttp開源框架學習二 非同步請求總結

2021-09-24 17:50:31 字數 2954 閱讀 1942

目錄

系列文章:

第四步,call.enqueue()

okhttp開源框架學習一:同步請求總結

okhttp開源框架學習二:非同步請求總結

okhttp開源框架學習三:任務排程核心類dispatcher

okhttp開源框架學習四:***

okhttp開源框架學習五:***之retryandfollowupinterceptor

okhttp開源框架學習六:***之bridgeinterceptor

okhttp開源框架學習七:快取策略原始碼分析

okhttp開源框架學習八:***之cacheinterceptor

okhttp開源框架學習九:***之connectinterceptor

okhttp開源框架學習十:connectionpool連線池

okhttp開源框架學習十一:***之callserverinterceptor

okhttp總結

第一步,建立乙個okhttpclient物件

第二步,建立攜帶請求資訊的request物件

第三步,建立call物件

這三步跟建立同步請求一樣,不再贅述。另外,我們需要知道,前三步是沒有傳送網路請求的,真正傳送請求的是第四步。

**如下:

/** * 非同步請求 */

public void asyncrequest()

@override

public void onresponse(call call, response response) throws ioexception

});}

我們看enqueue方法:

public void enqueue(callback responsecallback) 

capturecallstacktrace();

eventlistener.callstart(this);

client.dispatcher().enqueue(new asynccall(responsecallback));

}

我們先來解讀

synchronized (this)
executed可以理解為該請求是否已經執行過,如果執行過,就丟擲異常,說明call請求只能被執行一次。

然後我們來解讀:

client.dispatcher().enqueue(new asynccall(responsecallback));
synchronized void enqueue(asynccall call)  else 

}

runningasynccalls表示正在執行的call的數量

readyasynccalls表示等待執行的call的數量

接下來解讀

executorservice().execute(call);
public synchronized executorservice executorservice() 

return executorservice;

}

executorservice()方法裡設定了一些基本引數,建立了乙個執行緒池threadpoolexecutor。

接下來,就是execute(call)方法了,在這裡,我們要開始執行執行緒池裡各個子執行緒的run方法。接下來經過一系列查詢

先找到

final class asynccall extends namedrunnable
我們發現在asynccall中沒有run方法,接著進入namedrunnable

public abstract class namedrunnable implements runnable 

@override public final void run() finally

} protected abstract void execute();

}

雖然找到了run方法,但是我們發現並沒有什麼具體的操作,只是做了個包裝而已,裡面也只有乙個execute()方法。execute()是乙個抽象的方法,接下來我們就找到了realcall的asynccall的execute()方法:

@override 

protected void execute() else

} catch (ioexception e) else

} finally

}}

在這裡我們看到了熟悉的onfailure和onresponse方法。

我們主要來看:

finally
void finished(asynccall call)
private void finished(dequecalls, t call, boolean promotecalls) 

if (runningcallscount == 0 && idlecallback != null)

}

在finished方法中,主要做了三件事:

if (!calls.remove(call)) throw new assertionerror("call wasn't in-flight!");把當前請求從請求佇列中remove掉

if (promotecalls) promotecalls(); 呼叫promotecalls()方法,該方法是為了調整整個非同步請求任務的佇列

runningcallscount = runningcallscount();重新計算正在執行的call的數量並賦值

okhttp框架學習

整合和 預設是get請求 根據天氣id請求城市天氣資訊。public void requestweather final string weatherid else swiperefresh.setrefreshing false override public void onfailure cal...

OKHttp開源框架學習七 快取策略原始碼分析

目錄 系列文章 體現 cache類的put方法 cache類的get方法 okhttp開源框架學習一 同步請求總結 okhttp開源框架學習二 非同步請求總結 okhttp開源框架學習三 任務排程核心類dispatcher okhttp開源框架學習四 okhttp開源框架學習五 之retryandf...

如果學習開源框架

當我們在學習乙個開源框架時,成熟的開源框架一般都會非常龐大,各個模組 包之間會有依賴關係,而如果只是修改開源包的話,始終覺得不能真正地從根本上理解 實現乙個開源框架。如果自己去模仿著寫乙個的話,也會非常痛苦,因為想實現模組a,但是寫著寫著,發現模組a依賴了太多其他模組的東西,導致無法繼續模仿下去。有...