OKHTTP中快取使用理解
OkHttpClient.Builder builder = new OkHttpClient.Builder();builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);builder.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);builder.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);if (Ln.isDebugEnabled()) { HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC); builder.interceptors().add(loggingInterceptor);}builder.cache(new Cache(new File(context.getFilesDir(), "responses"), CONST_10 * CONST_1024 * CONST_1024)); //設定快取存在路徑和大小if (DevSettingStore.isDevChannel()) { builder.interceptors().add(new DevUrlInterceptor(context));}builder.interceptors().add(new NetStatisticsInterceptor());// 無網路時,快取一天builder.interceptors().add(new LocalCacheInterceptor(context, NetAccessStrategy.DEFAULT_MAX_LOCAL_CACHE_SECONDS));// 有網路時,快取時間設定builder.networkInterceptors().add(0, new NetCacheInterceptor(NetAccessStrategy.DEFAULT_MAX_NET_CACHE_SECONDS));builder.build(); |
package common.retrofit.interceptor;import android.content.Context;import android.text.TextUtils;import common.retrofit.NetAccessStrategy;import common.utils.NetworkUtils;import java.io.IOException;import java.util.concurrent.TimeUnit;import okhttp3.CacheControl;import okhttp3.Interceptor;import okhttp3.Request;import okhttp3.Response;public class LocalCacheInterceptor implements Interceptor {private int maxCacheSeconds;private Context context;public LocalCacheInterceptor(Context context, int maxCacheSeconds) {this.context = context;this.maxCacheSeconds = maxCacheSeconds; }@Overridepublic Response intercept(Chain chain) throws IOException { Request request = chain.request(); String header = request.header("Cache-Control");if (TextUtils.isEmpty(header)) {if (!NetworkUtils.isNetworkAvailable(context)) { Request.Builder builder = request.newBuilder();//if network not available, load in cacheCacheControl cacheControl = new CacheControl.Builder().maxAge(Integer.MAX_VALUE, TimeUnit.SECONDS) .maxStale(maxCacheSeconds, TimeUnit.SECONDS).build(); request = builder.cacheControl(cacheControl).build(); return chain.proceed(request); } } else if (NetAccessStrategy.NO_CONTROL.equals(header)) { Request.Builder builder = request.newBuilder();if (NetworkUtils.isNetworkAvailable(context)) { builder.removeHeader("Cache-Control"); } else {//if network not available, load in cacheCacheControl cacheControl = new CacheControl.Builder().maxAge(Integer.MAX_VALUE, TimeUnit.SECONDS) .maxStale(maxCacheSeconds, TimeUnit.SECONDS).build(); builder.cacheControl(cacheControl); }return chain.proceed(builder.build()); } else if (header.startsWith(NetAccessStrategy.NET_REQUEST)) { Request.Builder builder = request.newBuilder();int[] timeArray = NetAccessStrategy.getRequestCacheTime(header); CacheControl cacheControl = new CacheControl.Builder().maxAge(timeArray[0], TimeUnit.SECONDS).build(); NetAccessStrategy.setThreadLocalCacheTime(timeArray[1]); builder.cacheControl(cacheControl);return chain.proceed(builder.build()); }return chain.proceed(request); }} |
package common.retrofit.interceptor;import android.text.TextUtils;import common.retrofit.NetAccessStrategy;import java.io.IOException;import okhttp3.Interceptor;import okhttp3.Request;import okhttp3.Response;public class NetCacheInterceptor implements Interceptor {private int maxCacheSeconds;public NetCacheInterceptor(int maxCacheSeconds) {this.maxCacheSeconds = maxCacheSeconds; }@Overridepublic Response intercept(Chain chain) throws IOException { Request request = chain.request();int time = NetAccessStrategy.getThreadLocalCacheTime();if (TextUtils.isEmpty(request.header("Cache-Control"))) { Request.Builder builder = request.newBuilder(); request = builder.build(); Response originalResponse = chain.proceed(request);return originalResponse.newBuilder().header("Cache-Control", "public, max-age=" + maxCacheSeconds) .build(); } else { Request.Builder builder = request.newBuilder(); request = builder.build(); Response originalResponse = chain.proceed(request);if (time > 0) {return originalResponse.newBuilder().header("Cache-Control", "public, max-age=" + time) .build(); }return originalResponse.newBuilder().header("Cache-Control", request.header("Cache-Control")) .build(); } }} |
相關推薦
OKHTTP中快取使用理解
一、快取使用的背景 APP在網路請求過程中,存在這樣幾個場景,在斷網情況下需要APP頁面存在原有網路請求下來的圖片和資訊;不論網路是否正常,某些後臺資訊在短時間內都不會被更新了,APP中觸發的網路請求不用去後臺獲取資訊,給後臺帶來壓力;使用者的資訊必須去後臺進行
ios--->OC中Protocol理解及在代理模式中的使用
markdown 全部 interface int n) 遇到 其它 car mailto OC中Protocol理解及在代理模式中的使用 Protocol基本概念 Protocol翻譯過來, 叫做”協議”,其作用就是用來聲明一些方法; Protocol(協議)的作用
scala中Stream理解
求值 nbsp pan stream int cal scala 全部 head // Stream:Stream is lazy List; // Stream惰性求值指它只確定第一個值,後面的值用到再求值,這樣可以防止數據過大全部加載導致內存溢出 // 將
tensorflow 中 reduce_sum 理解
post flow const body 理解 ant pan ims tensor 定義如下: reduce_sum( input_tensor, axis=None, keep_dims=False, name=None,
(轉)Python中如何理解if __name__ == '__main__'
面向 知識 about main 想要 二進制 imp space 包導入 摘要 通俗的理解 __name__ == ‘__main__‘ :假如你叫李凱.py,在朋友眼中,你是李凱( __name__ == ‘李凱‘ );在你自己眼中,你是你自己( __name__ ==
package.json中版本理解
bsp 滿足 ack pac one isp .json style Bugfix 一個完整的版本號可以理解為: [主要版本號,次要版本號,補丁版本號]版本號 x.y.z :其中z 表示一些小的bugfix, y表示一些大的版本更改,比如一些API的變化x表示一些設計的變動
如何找到微信中快取的檔案以及微信網頁中下載的遊戲
第一級目錄為 : Tencent 第二級目錄為:MicroMsg (微信) MobileQQ (QQ) 第三級目錄為:BigFile (儲存大的檔案 如遊戲) 檔名是隨機加密的 我們可以從大小看出
03 -1 pandas 中 DataFrame理解與建立、索引、運算的詳解以及例項
DataFrame DataFrame是一個【表格型】的資料結構,可以看做是【由Series組成的字典】(共用同一個索引)。DataFrame由按一定順序排列的多列資料組成。設計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。 行索引
Hibernate Session一級快取理解
Hibernate框架中有2級快取: 1.其中一級快取主要為Session快取,透過session查詢到資料庫的內容會被存到session快取中 後續如果訪問就不會從資料庫拿資料,而是直接從session快取中(也就是記憶體)取資料。減少了資料庫訪問次數。 &n
web前端部署過程中快取出現的問題 生產實戰經驗 移動端H5
目錄 增加時間戳 或者 版本號 chrome: provisional header are showed 漏掉的ng-include 手機各種機型 對快取的不同處理 (2018) – 移動端H5混合應用的新版本生產部署之後, 出現的各種情況和實
Retrofit+okhttp+rxjava, 快取策略使用
主要涉及幾個要點: 要使用離線快取的頁面網路請求方式必須要用GET(POST不可以),其他不要的頁面還是用POST 在新增攔截器時,需要新增網路攔截器( .addNetworkInterceptor(new NetInterceptor()) //有網情況下,一分鐘內每次
vue專案中快取問題
單頁面應用總是存在快取問題,特別是在微信端,更新頁面之後訪問的還是老頁面,快取的問題是因為使用者訪問的指令碼地址並沒有改變,瀏覽器就會讀取原來的指令碼 網上有幾種解決辦法,首先列舉一下 1.加meta,禁止頁面快取 如果有些功能需要頁面快取的話這種方式就不適用,而且禁止快取之後使用者的請求的次數就會
H5中快取機制
webstorage機制 一、localStorage 用於永久性的進行本地快取,不會自動清除、沒有過期時間,直至手動清除資料。 儲存方式 ● 以鍵值對的形式進行儲存 , 儲存的方式只能是String型別。獲取的資料也只能是String型別 window.localStorage.setIte
redis 第 13 篇 工作記錄-在專案中快取是如何使用的?快取如果使用不當會造成什麼後果?
針對每一個技術,必須具備深入的瞭解,這個技術的更新活躍度,使用這個技術的優點,使用這個技術的缺點,不使用的缺點以及優點。如果不這樣的話,智只能說明自己平時思考的太少了,只知道幹活。 (1)為啥要使用快取 用快取,主要是倆用途,高效能和高併發 高效能
python中快取模組的一些用法
python快取模組的一些用法 一.問題描述 有時候可能需要快取一些 成員方法的值, 可能成員方法的計算比較耗時,有時候不希望重複呼叫計算該值, 這個時候就可以快取該值. 查了一下標準庫 有 functools.lru_cache 有一個 lru_cac
C#中快取的使用
快取的概念及優缺點在這裡就不多做介紹,主要介紹一下使用的方法。 1.在ASP.NET中頁面快取的使用方法簡單,只需要在aspx頁的頂部加上一句宣告即可: <%@ OutputCache Duration="100" VaryByParam="none" %> Duration:快取時間
web開發中快取機制的種類
1.資料庫快取 我們可能聽說過memcached,它就是一種資料庫層面的快取方案。資料庫快取是指,當web應用的關係比較複雜,資料庫中的表很多的時候,如果頻繁進行 資料庫查詢,很容易導致資料庫不堪重荷。為了提供查詢的效能,將查詢後的資料放到記憶體中進行快取,下次
HDU 2087 剪花布條 KMP(判斷不重疊區間加以判斷)在看題中逐漸理解kmp...
http://acm.hdu.edu.cn/showproblem.php?pid=2087 #include <iostream> #include<cstdio> #include<algorithm> #include<cstring> #i
百度地圖開發中不理解的部分(二)
不是很明白allowBackup的方法 查詢一下 Android API Level 8及其以上Android系統提供了為應用程式資料的備份和恢復功能,此功能的開關決定於該應用程式中AndroidManifest.xml檔案中的allowBackup屬性值
Python 中fork()理解
參考:多程序- 廖雪峰的官方網站 首先,在python中我們要實現多程序,有兩個模組可以用: 1)os中的fork()函式 2)multiprocessing模組 那麼這兩個模組有什麼區別呢? 在for