導航:首頁 > 操作系統 > androidhttp非同步請求

androidhttp非同步請求

發布時間:2024-12-28 09:08:03

㈠ Android通過OKhttp從伺服器端獲取數據

①簡單的異棚洞步Get請求
第一步,創建OKHttpClient對象
第二步,創建Request請求
第三步,創建一個Call對象
第四步,將請求添大和賀加到調度中
不多說,直接上代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

//okHttp的基本使用 --- get方法
String url = "https://api.douban.com/v2/movie/top250?start=0&count=10";
//1,創建OKHttpClient對象
OkHttpClient mOkHttpClient = new OkHttpClient();
//2,創建一個Request
Request request = new Request.Builder().url(url).build();
//3,創建一個call對象
Call call = mOkHttpClient.newCall(request);
//4,將請求添加到調滾派度中
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {

}

@Override
public void onResponse(Response response) throws IOException {
if (response.isSuccessful()) {
final String message = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
tv_message.setText(message);
progressBar.setVisibility(View.GONE);
}
});

}
}

});

㈡ Android網路請求庫【OkHttp4.9.3】基本用法與原理分析

OkHttp是一套處理 HTTP 網路請求的依賴庫,由 Square 公司設計研發並開源,目前可以在 Java 和 Kotlin 中使用。對於 Android App 來說,OkHttp 現在幾乎已經占據了所有的網路請求操作,Retrofit + OkHttp實現網路請求似乎成了一種標配。因此它也是每一個 Android 開發工程師的必備技能,了解其內部實現原理可以更好地進行功能擴展、封裝以及優化。

OkHttp的高效性體現在:

第一步:創建OkHttpClient,創建OkHttpClient有兩種方式:

OkHttpClient提供了豐富的配置方法,例如添加攔截器、指定連接池、設置請求超時等等。

第二步:創建請求

使用Request.Builder() 構建Request實例

第三步:發起網路請求

OkHttp支持同步和非同步兩種請求方式

OkHttp的使用方法非常簡單,三步操作就可以發起一個簡單的同步或非同步請求。我們也可以很輕松地對網路請求進行配置,例如添加請求頭、設置請求方式、設置請求超時等等,這些配置參數會在源碼分析過程中詳細介紹。

現在我們已經學會了三步操作發起網路請求,接下來以這三個步驟為切入點,深入到源碼中學習OkHttp的實現原理,廢話少說馬上開車。

OkHttpClient創建方式有兩種,我們看看兩種方式有什麼區別。

第一種直接使用默認構造函數,內部依然是使用建造者模式

第二種使用建造者模式

兩種方式最終都是調用構造函數OkHttpClient(builder:Builder),由參數builder負責所有的參數配置工作。

當您創建單個OkHttpClient實例並將其用於所有 HTTP 調用時,OkHttp 性能最佳。 這是因為每個OkHttpClient都擁有自己的連接池和線程池,重用連接和線程可減少延遲並節省內存。 相反,為每個請求創建一個客戶端會浪費空閑池上的資源。

Request同樣使用建造者模式來創建,這里貼上部分重要源碼,很簡單就不細說了。

OkHttp發起網路請求分為同步請求和非同步請求兩種方式,我們只分析非同步請求流程,因為只要理解了非同步請求過程,基本上也就明白同步請求是怎麼一回事了。

RealCall是連接應用層與網路層的橋梁,負責處理連接、請求、響應和數據流。

Dispatcher維護著一套非同步任務執行策略,分析策略之前先介紹幾個重要概念:

client.dispatcher.enqueue(AsyncCall(responseCallback)) 執行步驟為:

AsyncCall實現了Runnable介面,因此一旦被線程池中的線程處理就會調用它的run()方法:

話休絮煩,我們開始分析攔截器責任鏈:

責任鏈執行流程:首先獲取當前攔截器interceptor,並且調用interceptor.intercept(next)執行攔截器操作。這里的next表示的是index+1後的責任鏈對象,攔截器的intercept()方法內部會調用next.proceed(request)方法再次進入到責任鏈,由於此時index已經加1,所以處理的是下一個攔截器。

如此循環往復,直到處理完責任鏈上最後一個攔截器為止。

注意除最後一個攔截器CallServerInterceptor不會調用chain.proceed(request)方法之外,其他攔截器都應該至少調用一次chain.proceed(request)方法。

為了驗證上面的結論,我們進入到RetryAndFollowUpInterceptor的intercept()方法一探究竟:

可以看到注釋1處重新進入責任鏈處理下一個攔截器。

有興趣可以自行查看最後一個攔截器CallServerInterceptor源碼,此處只給出本人閱讀源碼後得出的結論:

以上就是攔截器責任鏈的工作流程,我們再通過流程圖仔細感受一下。

分析完攔截器責任鏈,我們繼續分析AsyncCall#run()方法:

我們看到,如果()方法成功獲得服務端返回的數據,則調用responseCallback.onResponse(this@RealCall, response)方法完成非同步回調;如果服務端數據獲取失敗(請求異常),則調用responseCallback.onFailure(this@RealCall, canceledException)方法完成非同步回調

需要注意的是,responseCallback回調是在子線程中完成的,所以如果想把數據顯示到UI上,需要切換回主線程進行UI操作。

OkHttp發起網路請求全過程:

【知識點】OkHttp 原理 8 連問

閱讀全文

與androidhttp非同步請求相關的資料

熱點內容
java向量空間模型 瀏覽:841
哪個app訂餐便宜 瀏覽:672
有什麼app可能存聊天記錄 瀏覽:468
強國app中的紀錄片在哪裡 瀏覽:714
dell伺服器可用什麼樣硬碟 瀏覽:636
javanewbyte 瀏覽:309
晶元app哪個好 瀏覽:751
文件夾名稱laptop怎麼去掉 瀏覽:247
單片機中斷應用 瀏覽:622
搜狗app哪個好用 瀏覽:452
中信銀行還完貸款什麼時候給解壓 瀏覽:233
ug自學編程入門 瀏覽:612
英語口語900句pdf 瀏覽:565
javabyte拼接 瀏覽:481
加密應用在哪裡找vivo 瀏覽:290
python讀寫圖像 瀏覽:289
不是金山毒霸會員文件還能加密嗎 瀏覽:955
python網站開發教程 瀏覽:875
安卓超感畫質引擎是什麼意思 瀏覽:323
ug80編程穩定嗎 瀏覽:706