【Android】OKHttp網絡請求原理和弱網優化

【Android】OKHttp網絡請求原理和弱網優化


1. OkHttp 網絡請求原理

OkHttp 的請求過程可以分為 四個關鍵階段
(假設你是通過 OkHttpClient.newCall(request).enqueue(callback) 發的請求)

OkHttpClient│▼
Dispatcher (調度器)│▼
RealCall (真正的Call實現)│▼
Interceptor Chain (攔截器責任鏈)│▼
Stream/Connection (TCP/SSL/HTTP2)

核心組件

  1. OkHttpClient
    • 全局配置(超時、攔截器、連接池、緩存等)
    • 線程安全,推薦單例。
  2. Dispatcher(調度器)
    • 維護同步/異步請求隊列
    • 默認異步最大并發請求數 = 64(每個host默認5個并發)
  3. RealCall
    • 封裝了一個具體的 HTTP 調用過程。
    • 同步時走 execute(),異步時走 enqueue()
  4. Interceptor Chain(攔截器鏈)
    OkHttp 的核心,按順序執行:
    • Application Interceptor(應用攔截器)
      你自己加的,比如統一加 Header、埋點。
    • RetryAndFollowUpInterceptor(重試&重定向)
      處理失敗重試、HTTP 3xx 跟隨跳轉。
    • BridgeInterceptor(橋接攔截器)
      把用戶的 Request 轉成可發的 HTTP Request(補默認 Header,比如 Content-Type)。
    • CacheInterceptor(緩存攔截器)
      負責讀寫緩存(符合 HTTP 緩存協議的才會生效)。
    • ConnectInterceptor(連接攔截器)
      找到可用的連接(可能復用連接池的 TCP/HTTP2)。
    • CallServerInterceptor(發送請求 & 讀取響應)。
  5. 連接池(ConnectionPool)
    • 復用 TCP 連接(默認 5 分鐘閑置后關閉)
    • 對弱網非常重要,減少 TCP/TLS 握手開銷。

2. 弱網優化思路(基于 OkHttp 原理)

弱網優化要考慮 連接建立數據傳輸失敗恢復 三方面:


(1) 減少連接開銷

  • 啟用連接池(默認已開啟)

    new OkHttpClient.Builder().connectionPool(new ConnectionPool(10, 5, TimeUnit.MINUTES))
    

    提高空閑連接數和保活時間,減少頻繁建連。

  • HTTP/2
    如果服務端支持,啟用 HTTP/2 可以一個 TCP 連接多路復用多個請求,減少弱網下握手阻塞。

  • DNS 預解析 + 緩存
    弱網 DNS 解析可能很慢,可以提前解析:

    OkHttpClient client = new OkHttpClient.Builder().dns(hostname -> {List<InetAddress> addresses = Arrays.asList(InetAddress.getAllByName(hostname));return addresses; // 可做本地緩存}).build();
    

(2) 控制請求超時策略

弱網時默認超時可能不合適,可以分類型調整:

OkHttpClient client = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS)   // 建立連接超時.readTimeout(8, TimeUnit.SECONDS)      // 讀取超時.writeTimeout(8, TimeUnit.SECONDS)     // 寫入超時.retryOnConnectionFailure(true)        // 啟用失敗重試.build();
  • 短連接超時:弱網時快速放棄連接不上的 IP,走備用。
  • 讀寫時間略放寬:弱網傳輸慢,避免誤判失敗。

(3) 分片/斷點續傳

  • 大文件上傳/下載弱網下易中斷,建議用 Range 分片

    Range: bytes=0-1023
    
  • 中斷后只請求剩余部分,減少重傳。


(4) 降級策略

弱網下可以:

  • 壓縮數據(Gzip / WebP 圖片)
    OkHttp 默認支持 Gzip 解壓,服務端加 Content-Encoding: gzip 即可。
  • 減少請求次數
    合并多個小請求為一個大請求。
  • 先本地緩存/后上傳
    弱網先本地存儲(Room/SQLite),網絡恢復后批量上傳。

(5) 智能重試

默認的 RetryAndFollowUpInterceptor 只會在特定錯誤下重試。
你可以自定義攔截器來做指數退避重試

class RetryInterceptor implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {int tryCount = 0;IOException lastException;while (tryCount < 3) {try {return chain.proceed(chain.request());} catch (IOException e) {lastException = e;tryCount++;Thread.sleep((long) Math.pow(2, tryCount) * 500); // 500ms, 1s, 2s}}throw lastException;}
}

(6) 弱網檢測 + 動態策略

可用 TrafficStats 或測速接口判斷弱網,然后動態調整 OkHttp:

if (isWeakNetwork()) {// 降低并發、延長超時
} else {// 正常配置
}

? 總結

  • OkHttp 的本質是攔截器責任鏈 + 連接池復用,弱網優化重點是減少握手、緩存結果、控制超時、重試與降級
  • 最實用的三個點:連接復用(ConnectionPool)HTTP/2重試退避策略
  • 如果弱網還卡,可以加弱網檢測配合動態參數調整。

還可以額外參考一下【淘寶移動端統一網絡庫的架構演進和弱網優化技術實踐】

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93865.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

概率論基礎教程第4章 隨機變量(四)

4.7 泊松隨機變量 定義 泊松隨機變量&#xff1a;如果一個取值于 $ 0, 1, 2, \ldots $ 的隨機變量對某一個 $ \lambda > 0 $&#xff0c;其分布列為&#xff1a; p(i)P{Xi}e?λλii!i0,1,2,?(7.1) \boxed{p(i) P\{X i\} e^{-\lambda} \frac{\lambda^i}{i!} \qquad i 0…

Unity高級開發:反射原理深入解析與實踐指南 C#

Unity高級開發&#xff1a;反射原理深入解析與實踐指南 在Unity游戲開發中&#xff0c;反射&#xff08;Reflection&#xff09; 是一項強大的元編程技術&#xff0c;它允許程序在運行時動態地獲取類型信息、創建對象和調用方法。根據Unity官方統計&#xff0c;超過78%的商業游…

任務五 推薦頁面功能開發

一、推薦頁面需求分析 由推薦頁面效果圖,可以看出,推薦頁面主要由頂部輪播圖和歌單列表頁面組成 二、推薦頁面輪播圖組件封裝 由于輪播圖,可能在項目多個地方用到,因此可以將輪播圖抽調成一個組件,然后各個頁面調用這個組件。 在開發輪播圖組件時,需要安裝better-scro…

【工具使用-Docker容器】構建自己的鏡像和容器

1. 鏡像和容器介紹 鏡像&#xff08;Image&#xff09;是一個只讀的模板&#xff0c;包含了運行某個應用所需的全部內容&#xff0c;比如&#xff1a; 操作系統&#xff08;比如 Ubuntu&#xff09;應用程序代碼運行環境&#xff08;如 Python、Java、Node.js 等&#xff09;庫…

Apache Shiro550 漏洞(CVE-2016-4437):原理剖析與實戰 SOP

在 Web 安全領域&#xff0c;反序列化漏洞一直是威脅等級極高的存在&#xff0c;而 Apache Shiro 框架中的 Shiro550 漏洞&#xff08;CVE-2016-4437&#xff09;&#xff0c;更是因利用門檻低、影響范圍廣&#xff0c;成為滲透測試中頻繁遇到的經典漏洞。本文將從 “原理拆解”…

安卓開發者自學鴻蒙開發3持久化/數據與UI綁定

AppStorage,PersistentStorage與StorageLink AppStorage是應用全局狀態管理器,數據存儲于內存中,常見的如全局的黑暗模式,StorageLink是用來綁定AppStorage的鍵到ui上的工具,省去了用戶手寫代碼的無聊過程,PersistentStorage可以綁定AppStorage的鍵,自動持久化到磁盤,同時支持多…

GitHub宕機生存指南:從應急協作到高可用架構設計

GitHub宕機生存指南&#xff1a;從應急協作到高可用架構設計 摘要&#xff1a; GitHub作為全球開發者的協作中心&#xff0c;其服務穩定性至關重要。然而&#xff0c;任何在線服務都無法保證100%的可用性。本文深入探討了當GitHub意外宕機時&#xff0c;開發團隊應如何應對。我…

機器學習算法篇(十三)------詞向量轉化的算法思想詳解與基于詞向量轉換的文本數據處理的好評差評分類實戰(NPL基礎實戰)

目錄 一、詞向量原理介紹 (1). 詞向量的核心概念 (2). 傳統文本表示的局限性 1. 獨熱編碼&#xff08;One-Hot Encoding&#xff09; 2. 詞袋模型&#xff08;Bag of Words&#xff09; 3. TF-IDF (3). 詞向量的核心原理 (4). 主流詞向量模型 1. Word2Vec&#xff08;20…

JS自定義函數(2)

1. 變量的作用域全局變量定義&#xff1a;在函數外聲明的變量作用范圍&#xff1a;在整個JS文檔中生效生命周期&#xff1a;頁面關閉時銷毀局部變量定義&#xff1a;在函數內用 var 聲明的變量作用范圍&#xff1a;只能在函數內部使用生命周期&#xff1a;函數執行完畢時銷毀作…

【數據集】Argoverse 數據集:自動駕駛研究的強大基石

Argoverse數據集&#xff1a;自動駕駛研究的強大基石 在自動駕駛技術蓬勃發展的當下&#xff0c;高質量的數據集對于推動相關算法研究和模型訓練起著舉足輕重的作用。Argoverse 數據集便是其中的佼佼者&#xff0c;它為自動駕駛領域的眾多任務提供了豐富且優質的數據資源。 一、…

--- 哈希表和哈希沖突 ---

哈希&#xff08;散列&#xff09;方法是對插入的數據通過哈希函數計算出一個哈希地值&#xff0c;并將這個哈希地址作為儲存改數據的地址&#xff0c;這樣下次再查找這個數據時&#xff0c;只需要通過哈希函數再獲取到該地址然后直接去拿就好這樣就做到了不經過任何比較&#…

數學建模-評價類問題-優劣解距離法(TOPSIS)

1-AI帶你認識TOPSIS&#x1f4d8; 一、TOPSIS 方法簡介1. ??基本定義&#xff1a;????TOPSIS&#xff08;Technique for Order Preference by Similarity to an Ideal Solution&#xff09;??&#xff0c;中文通常稱為&#xff1a;???優劣解距離法?????逼近理想…

Go協程:從匯編視角揭秘實現奧秘

&#x1f680; Go協程&#xff1a;從匯編視角揭秘實現奧秘 #Go語言 #協程原理 #并發編程 #底層實現 引用&#xff1a; 關于 Go 協同程序&#xff08;Coroutines 協程&#xff09;、Go 匯編及一些注意事項。 &#x1f31f; 前言&#xff1a;重新定義并發編程范式 在當今高并發…

MySQL 事務(重點)

MySQL 這個東西注定是可能會被多個用戶/客戶端來同時訪問的&#xff0c;這是肯定的&#xff0c;MySQL 中存放的都是數據&#xff0c;數據可能有一個上層線程在用&#xff0c;也有可能另一個線程也要用...數據是被所有人共享的&#xff0c;所以就注定了 MySQL 這樣的服務在一個時…

uniapp:h5鏈接拉起支付寶支付

場景&#xff1a;APP內點擊支付寶支付&#xff0c;后臺返回類似鏈接https://qr.alipay.com/bax***********c3050 通常做法是&#xff0c;使用plus.runtime.openURL(deeplink);先打開瀏覽器&#xff0c;瀏覽器會提示打開支付寶&#xff0c;之后是支付流程。現在可以省略跳轉h5的…

吳恩達 Machine Learning(Class 3)

Week 11.1 K-means Cluster centroidK-means 是無監督學習中聚類算法的一種&#xff0c;核心在于更新聚類質心&#xff1b;首先將每個點分配給幾個聚類質心&#xff0c;取決于那些點離哪個質心更近&#xff1b;然后將幾個聚類質心移動到分配給他的所有點的平均值&#xff0c;不…

MyBatis 動態查詢語句詳解:讓 SQL 更靈活可控

MyBatis 動態查詢語句詳解&#xff1a;讓 SQL 更靈活可控 在日常的數據庫操作中&#xff0c;我們經常會遇到需要根據不同條件拼接 SQL 語句的場景。比如查詢用戶時&#xff0c;可能需要根據姓名、年齡、性別等多個條件進行篩選&#xff0c;而這些條件往往是動態變化的 —— 有時…

Java基礎語法three

一、一維數組一維數組初始化數據類型[] 數組名new 數據類型[數組長度]//動態初始化數據類型[] 數組名new 數據類型[]{值}//靜態初始化數據類型[] 數組名{值}數組長度一旦確定&#xff0c;就不可更改。數組是序排序&#xff1b;數組屬于引用數據類型的變量&#xff0c;數組的元素…

【數據結構】排序算法全解析:概念與接口

1.排序的概念及其運用 1.1 排序的概念 排序&#xff1a;所謂排序&#xff0c;就是使一串記錄&#xff0c;按照其中的某個或某些關鍵字的大小&#xff0c;遞增或遞減的排列起來的操作。 穩定性&#xff1a;假定在待排序的記錄序列中&#xff0c;存在多個具有相同的關鍵字的…

在 CentOS 7 上使用 LAMP 架構部署 WordPress

CentOS 7 LAMP 架構部署 WordPress全步驟本文將詳細介紹如何在 CentOS 7 系統上通過 LAMP&#xff08;Linux Apache MariaDB PHP&#xff09;架構部署 WordPress 博客平臺。 在CentOS 7上基于LAMP架構部署WordPress 一、系統基礎配置 1. 修改主機名&#xff08;本機IP&#…