天天看點

如何更高效地使用 OkHttp

<b>本文講的是如何更高效地使用 OkHttp,</b>

<b></b>

轉載請聯系,并注明出處。

有些響應消息通過包含 <code>Cache-Control</code> HTTP 首部字段允許緩存,但是預設情況下,OkHttp 并不會緩存這些響應消息。是以你的用戶端可能會因為不斷請求相同的資源而浪費時間和帶寬,而不是簡單地讀取一下首次響應消息的緩存副本。

在可汗學院的應用中,我們指定了 <code>HTTP_RESPONSE_DISK_CACHE_MAX_SIZE</code> 的大小為 <code>10 * 1024 * 1024</code>,即 10MB。

Stetho 不僅能夠檢查應用的 SQLite 資料庫和視圖層次,還可以檢查 OkHttp 的每一條請求和響應消息:

如何更高效地使用 OkHttp

這種自我檢查方式(Introspection)有效地確定了伺服器傳回允許緩存資源的 HTTP 首部時,且核緩存資源存在時,不再發出任何請求。

開啟 Stetho,隻用簡單地添加一個 <code>StethoInterceptor</code> 執行個體到網絡攔截器(Network Interceptor)的清單中去:

應用運作完畢之後,打開 Chrome 然後跳轉到 <code>chrome://inspect</code>。裝置、應用以及應用辨別符資訊會被陳列出來。直接點選“inspect”連結就可以打開開發者工具,然後切換到 Network 标簽開始監測 OkHttp 發出的請求。

Retrofit 也有類似的工廠方法用來建立它自己的 <code>OkHttpClient</code>。

圖檔是應用中需要加載的最大的資源之一。Picasso 是嚴格地按照 LRU 政策在記憶體中維護它的圖檔緩存。如果用戶端嘗試用 Picasso 加載一張圖檔,并且 Picasso 沒有在記憶體緩存中找到該圖檔,那麼它會委托内部的 <code>OkHttpClient</code> 執行個體來加載該圖檔。在預設情況下,由于前面的 <code>defaultOkHttpClient</code> 方法沒有在檔案系統中配置響應緩存,該執行個體會一直從伺服器加載圖檔。

這就需要建構一個用你的 <code>OkHttpClient</code> 配置的 <code>Picasso</code> 執行個體。如果你在代碼中使用 <code>Picasso.with(context).load(...)</code> 來加載圖檔,你所使用的 <code>Picasso</code> 單例對象,是在 <code>with</code> 方法中用自己的 <code>OkHttpClient</code> 延遲加載和配置的。是以我們必須在第一次調用 <code>with</code> 方法之前指定自己的 <code>Picasso</code> 執行個體作為單例對象。

簡單地把 <code>OkHttpClient</code> 執行個體包裝到一個 <code>OkHttpDownloader</code> 對象中,然後傳遞給 <code>Picasso.Builder</code> 執行個體的 <code>downloader</code> 方法:

在 Retrofit 1.9.x 中,通過 <code>RestAdapter</code> 使用你的 <code>OkHttpClient</code> 執行個體,把 <code>OkHttpClient</code> 執行個體包裝到一個 <code>OkClient</code> 執行個體中,然後傳遞給 <code>RestAdapter.Builder</code> 執行個體的 <code>setClient</code> 方法:

在 Retrofit 2.0 中,直接把 <code>OkHttpClient</code> 執行個體傳遞給 <code>Retrofit.Builder</code> 執行個體的 <code>client</code> 即可。

這個 <code>OkHttpClient</code> 執行個體随後通過 Dagger 注入到其他用來建立 <code>RestAdapter</code> 和 <code>Picasso</code> 執行個體的 provider 裡。

使用任何你覺得有價值的資訊,來建立 <code>User-Agent</code> 值,然後傳遞給 <code>UserAgentInterceptor</code>的構造函數。我們使用了這些字段:

<code>os</code> 字段,值設定為 <code>Android</code>,明确表明這是一個 Android 裝置

<code>Build.MODEL</code> 字段,即使用者可見的終端産品的名稱

<code>Build.BRAND</code> 字段,即消費者可見的跟産品或硬體相關的商标

<code>Build.VERSION.SDK_INT</code> 字段,即使用者可見的 [Android] 架構版本号

<code>BuildConfig.APPLICATION_ID</code> 字段

<code>BuildConfig.VERSION_NAME</code> 字段

<code>BuildConfig.VERSION_CODE</code>字段

小提示:如果你的應用中用到了 <code>WebView</code>,你可以配置使用相同的 <code>User-Agent</code> 值,即之前建立的 <code>UserAgentInterceptor</code>:

在 2.5.0 版本之前,OkHttp 請求預設永不逾時。從 2.5.0 版本開始,如果建立了一個連接配接,或從連接配接讀取下一個位元組,或者向連接配接寫入下一個位元組,用時超過了10秒,請求就會逾時。分别調用 <code>setConnectTimeout</code>,<code>setReadTimeout</code> 或 <code>setWriteTimeout</code> 方法可以重寫那些預設值。

小提示:Picasso 和 Retrofit 為它們的預設 <code>OkHttpClient</code> 執行個體指定不同的逾時時長。 預設情況下, Picasso 設定如下:

連接配接逾時15秒

讀取逾時20秒

寫入逾時20秒

Retrofit 設定如下:

寫入無逾時

用你自己的 <code>OkHttpClient</code> 執行個體配置好 Picasso 和 Retrofit 之後,就能確定所有請求逾時的一緻性了。

再次強調,OkHttp 的預設配置提供了顯著的效果,但是采取以上的措施,可以提高 OkHttp 的可用性和自我檢查能力,并且提升你的應用的品質。

<b>原文釋出時間為:2016年01月07日</b>

<b>本文來自雲栖社群合作夥伴掘金,了解相關資訊可以關注掘金網站。</b>

下一篇: TLS 處理

繼續閱讀