Android面試題:okhttp
相關視訊:
相關文章:
Okhttp與其他網路框架的對比:
常見問題一:簡述一下OkHttp
OkHttp是一個非常優秀的網路請求框架,已被谷歌加入到Android的原始碼中。目前比較流行的Retrofit也是預設使用OkHttp的。
- 支援HTTP1.0、HTTP1.1、HTTP2.0、SPDY
- 支援同步非同步
- 可以快取響應資料,來減少重複的網路請求
- 可以從很多常用的連線問題中自動恢復
- 使用簡單(api多,可擴充套件性好)
常見問題二:看過OkHttp的原始碼嗎,簡單說一下
上面是OKHttp總體設計圖,主要是通過Diapatcher不斷從RequestQueue中取出請求(Call),根據是否已快取呼叫Cache或Network這兩類資料獲取介面之一,從記憶體快取或是伺服器取得請求的資料。該引擎有同步和非同步請求,同步請求通過Call.execute()直接返回當前的Response,而非同步請求會把當前的請求Call.enqueue新增(AsyncCall)到請求佇列中,並通過回撥(Callback)的方式來獲取最後結果。
一、基本知識:
(一)、HTTP協議結構:
請求頭
- 表明本次請求的客戶端
- 本次請求所使用的cookie
- 本次請求希望返回的資料型別
- 本次請求是否採用資料壓縮等等一系列設定
請求體
- 指定本次請求所使用的方法
- 主要用來攜帶本次請求的引數
響應頭
- 伺服器標識
- 狀態碼
- 內容編碼
- 返回給客戶端的cookie等
響應體
- 本次請求所返回的資料
(二)、HTTP工作流程
首先客戶機與伺服器需要建立連線(通過socket)
建立連線後,客戶機發送一個請求給伺服器
伺服器接到請求後,給予相應的響應資訊
客戶端接受伺服器所返回的資訊,連線斷開
(三)、HTTP優勢:
- 簡單快速
- 靈活
- 無連線
- 無狀態
解釋:其中最重要的事無連線和無狀態,在早期的網際網路中,由於協議都是一些比較簡單的協議,內容基本上都是一些靜態的頁面、圖片等,所以無連線、無狀態的HTTP可以發揮自己簡單快速、靈活的優勢。 但隨著業務邏輯越來越複雜以及我們對安全性的重視,無連線、無狀態反而成為了HTTP的劣勢,所以也就又來後來更加高階的網際網路協議的誕生。
(四)、SPDY(發音spidi)
- SPDY是一種HTTP的相容協議
- 支援多路複用請求
- 對請求劃分優先順序(優先返回文字,圖片音訊等隨後返回)
- 壓縮HTTP頭,以減少請求資料量
(五)、HTTP2.0介紹
- 基於SPDY,IETF定製的新一代HTTP
- 擁有更安全的SSL協議
(六)、okhttp
- 為我們android客戶端支援HTTP2.0提供了途徑
- 由著名的square團隊開發,開源
(七)、okhttp優勢:
- 支援SPDY、HTTP2.0,共享同一個socket來處理同一個伺服器的所有請求
- 如果SPDY不可用,則通過連線池來減少請求延時
- 無縫支援GZIP來減少資料流量
- 支援同步、非同步(非同步使用較多)
- 快取響應資料來減少重複的網路請求
- 可以從很多常用的連線問題中自動恢復
- 使用簡單(api多,可擴充套件性好)
二、OkHttp
(一)、總體設計
上面是OKHttp總體設計圖,主要是通過Diapatcher不斷從RequestQueue中取出請求(Call),根據是否已快取呼叫Cache或Network這兩類資料獲取介面之一,從記憶體快取或是伺服器取得請求的資料。該引擎有同步和非同步請求,同步請求通過Call.execute()直接返回當前的Response,而非同步請求會把當前的請求Call.enqueue新增(AsyncCall)到請求佇列中,並通過回撥(Callback)的方式來獲取最後結果。
(二)、流程圖
(三)、詳細類關係圖
由於整個設計類圖比較大,所以本人將從核心入口client、cache、interceptor、網路配置、連線池、平臺適配性…這些方面來逐一進行分析原始碼的設計。下面是核心入口OkHttpClient的類設計圖
三、封裝
網路模組封裝好處;
強大的可複用性;
與業務邏輯完全隔離;
強大的可擴充套件性;
封裝思路講解:
封裝一個公共的OkHttpClient(超時時間等基本設定,get,post等請求方法);
封裝一個通用的請求建立類CommonRequest;
封裝一個通用的響應解析類JsonCommonRequest;