Okhttp 插入緩存攔截器 解析

我們在做網絡請求的時候,如果網絡請求過于頻繁而且請求的數據變動不大,或者基本沒有變動,這個時候如果沒有緩存功能,我們想一下

會浪費掉多少資源,一次請求刷新一次,去請求一次,不但會消耗用戶的流量,而且還對服務端造成不必要的網絡壓力(當然如果服務器牛逼那么無所謂(*^__^*) )

所以除了自己做緩存以外okhttp自己也有一套緩存的機制

那就是繼承Interceptor接口

我們先下okhttp中 Interceptor的介紹

/*** Observes, modifies, and potentially short-circuits requests going out and the corresponding* responses coming back in. Typically interceptors add, remove, or transform headers on the request* or response.*/

他的大概意思就是 觀察,修改,并且使相應的請求走出去,通常添加這個攔截器去添加,移除,或者轉換這個請求或者返回的的header 頭部信息。

所以這個攔截器的作用就是去修改請求或者返回的頭部信息。

那么為什么修改頭部信息的攔截器就能做到緩存呢?

我們先看一個包含首部的Http Entry

http://google.com/foo
GET
2
Accept-Language: fr-CA
Accept-Charset: UTF-8
HTTP/1.1 200 OK
3
Content-Type: image/png
Content-Length: 100
Cache-Control: max-age=600

?

可以看到頭部信息有一個Cache-Control緩存控制

我們可以通過設置這個對Http請求進行緩存設置

下面直接看這個類吧(非自己編寫,但是忘了作者的地址)

public class CacheInterceptor implements Interceptor {private Context mContext;@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();//獲取請求//這里就是說判讀我們的網絡條件,要是有網絡的話我么就直接獲取網絡上面的數據,要是沒有網絡的話我么就去緩存里面取數據if(Utils.GetConnectType(mContext) == Constant.NetworkStatus.DisConnect){request = request.newBuilder()//這么寫就是只從緩存取
            .cacheControl(CacheControl.FORCE_CACHE).build();LogUtils.v("CacheInterceptor\",\"no network\"");}Response orginalResponse = chain.proceed(request);//有網絡的條件下if(Utils.GetConnectType(mContext) != Constant.NetworkStatus.DisConnect){String cacheControl = request.cacheControl().toString();return orginalResponse.newBuilder()//這里設置的為0就是說不進行緩存,我們也可以設置緩存時間.header("Cache-Control", "public, max-age=" + 0).removeHeader("Pragma").build();}else{int maxTime = 4*24*60*60;return orginalResponse.newBuilder()//這里的設置的是我們的沒有網絡的緩存時間,想設置多少就是多少。.header("Cache-Control", "public, only-if-cached, max-stale="+maxTime).removeHeader("Pragma").build();}}public CacheInterceptor(Context context){this.mContext = context;}}

類里面分別對無網絡情況,和有網絡情況進行了一個區分,無網絡情況下我們在緩存中取,有網絡條件下直接進行請求并且還可以設置緩存時間

轉載于:https://www.cnblogs.com/fengfenghuifei/p/8065087.html

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

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

相關文章

淺談PROFINET IO通信的實時性

PROFINET由PROFIBUS國際組織(PROFIBUS International,PI)推出,是新一代基于工業以太網技術的自動化總線標準。作為一項戰略性的技術創新,PROFINET為自動化通信領域提 供了一個完整的網絡解決方案,囊括了諸如…

目標

學習計劃以及目標---------------------------------------------------------------------------------------------------------------------------------------------------------------- 正文 在上大學之前,可以說我完全是一個…

今日頭條核心技術“個性推薦算法”揭秘

今日頭條核心技術“個性推薦算法”揭秘 最近面試華興資本, 他們比較關注今日頭條算法的實現, 今天特轉載網上 今日頭條算法解密【IT168 評論】互聯網給用戶帶來了大量的信息,滿足了用戶在信息時代對信息的需求,也使得用戶在面對大…

PROFINET及其同步實時通訊分析

1 概述 PROFINET實時以太網是由Profibus International(PI)組織提出的基于以太網的自動化標準。從2004年4月開 始,PI與Interbus Club總線俱樂部聯手,負責合作開發與制定標準。PROFINET構成從I/O級直至協調治理級的基于組件的分…

【劍指offer15.二進制中1的個數】——位操作(左移右移等)

目錄 二進制的表示 二進制的位操作 應用: 劍指offer15.統計二進制中1的個數(多種方法,位右移操作、與操作等) 轉自:https://www.jianshu.com/p/3a31065a8e58 紅色為自己添加 我們都知道在計算機中所有的信息最終都…

java 異常處理機制(java 編程思想)

一、概念  “異常”這個詞有“我對此感到意外”的意思。問題出現了,你也許并不清楚該如何處理,但你的確知道不應該置之不理;你要停下來,看看是不是有別人或在別的地方,能夠處理這個問題。只是在當前的環境中還沒有足夠…

怎樣在CentOS 7.0上安裝和配置VNC服務器

這是一個關于怎樣在你的 CentOS 7 上安裝配置 VNC 服務的教程。當然這個教程也適合 RHEL 7 。在這個教程里,我們將學習什么是 VNC 以及怎樣在 CentOS 7 上安裝配置 VNC 服務器 。 我們都知道 這是一個關于怎樣在你的 CentOS 7 上安裝配置 VNC 服務的教程。當然這個教…

MOTOMAN機器人網絡控制的實現

最初程序員在Unix系統下使用Berkeley Socket編寫網絡程序,隨著Windows操作系統的普及,Microsoft、Sun等公司聯合開發了Winsock接口API。它實質上是一種進 程間通信,將之從單機環境擴展到網絡環境以適合于開發主機/客戶機通信程序。網絡通信的…

【劍指offer】——【python中return函數中的and和or表達式的返回值】

目錄 1、# and 結果為真,返回最后一個表達式的結果,若結果為假返回第一個為假的表達式的結果 2、# or 結果為真,返回第一個為真的表達式的結果,若結果為假,返回最后一個表達式的結果 3、應用[劍指 Offer 64. 求12…n…

Spring Cloud構建微服務架構:消息驅動的微服務(入門)【Dalston版】

2019獨角獸企業重金招聘Python工程師標準>>> 之前在寫Spring Boot基礎教程的時候寫過一篇《Spring Boot中使用RabbitMQ》。在該文中,我們通過簡單的配置和注解就能實現向RabbitMQ中生產和消費消息。實際上我們使用的對RabbitMQ的starter就是通過Spring C…

CXF 客服端調用報錯

服務端已經發布了WSDL,現在在客服端生成web service客服端代碼,在eclipse中新建一個project,然后new->web services->web service client生產客戶端代碼 在調用的時候報如下錯誤 解決:缺少axis相應的jar包,加入包…

20145225 《信息安全系統設計基礎》第10周學習總結

cp1.c 進行復制文件的操作,需要有源文件和目的文件,第一次命令沒有加入所以沒有正常完成復制文件的操作fileinfo.c 用來實現顯示文件信息。先判斷命令是否有操作數,有的話才能繼續進行下去,如果沒有報錯就打印出來相關文件信息&am…

做演員是圓夢 做生意學會面對現實

田樸珺是一位擁有多重身份的女性。她是一名演員,也是一位商人,還擔任過電影《中國合伙人》的制片人。 作為演員,田樸珺的作品并不是很多,也一直不溫不 火。但這并不代表她將放棄演藝生涯。她表示,如果機會合適&…

【深度學習】——模型評估指標MAP計算實例計算

目錄 一、知識儲備 1、IOU——交集面積與并集面積之比 2、混淆矩陣(TP、FP、FN、TN) 問題1:上面的TP等具體是如何計算得到的? 3、精度precision&召回率recall 二、ap計算實戰 1、計算流程 1)準備數據&#xf…

第 52 章 Web Server Optimization

系統配置 Intel(R) Xeon(TM) CPU 3.00GHzMemory 4GEthernet adapter 1000M52.1. ulimit 查看 ulimit ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited pending signals …

hdu5489 Removed Interval dp+線段樹優化

現在看這題居然直接秒了。。。去年看的時候還以為神題。。 設以第i項為結尾的lis前綴為f[i],以第j項為結尾的lis后綴為g[i],如果求出f[i]和g[j],然后枚舉i,快速找到最大的滿足a[j]>a[i]的g[j]就可以了。注意到如果將f[i]從后往…

JS原型鏈理解

1. 每個對象都有原型屬性(__proto__)2. 對象的原型(__proto__)指向其構造函數(Constructor)的prototype屬性3. 構造函數(Constructor)的prototype屬性本身也是一個對象,其原型(__proto__)亦指向其構造函數的prototype4. 如此形成一個鏈式結構,而Construc…

【深度學習】——2021年FPN特征金字塔

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/4/22 17:06 # Author : linlianqin # Site : # File : fpn.py # Software: PyCharm # description:其搭建的基本流程和resnet是一致的,只是將每一層的卷積結果保存了起來import torch impo…

NoSQL分類及ehcache memcache redis 三大緩存的對比

NoSQL分類 由于NoSQL中沒有像傳統數據庫那樣定義數據的組織方式為關系型的,所以只要內部的數據組織采用了非關系型的方式,就可以稱之為NoSQL數據庫。目前,可以將眾多的NoSQL數據庫按照內部的數據組織形式進行如下分類: Key/Value的…

52.4. APC Cache (php-apc - APC (Alternative PHP Cache) module for PHP 5)

$ apt-cache search php-apc php-apc - APC (Alternative PHP Cache) module for PHP 5$ sudo apt-get install php-apcapc cache 狀態監控 http://pecl.php.net/package/APC 下載解包找到apc.php,放到web服務器上 原文出處:Netkiller 系列 手札 本文作者&#xff1…