国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

OkHttp基本使用(四)緩存

2019-11-06 09:44:46
字體:
來源:轉載
供稿:網友
此篇介紹OkHttp的緩存功能,實現無網絡情況下從緩存讀取數據,類似很多新聞類的APP,在沒有網絡的情況下也是可以進入首頁。除了新聞類,可能還有閱讀類的app也需要緩存功能,等等。總之緩存在實際項目開發中使用得比較平凡,而如果要我們自己去寫一套緩存邏輯,顯然是很麻煩的。接下來,介紹OkHttp的緩存功能的使用。配置緩存大小和緩存目錄//獲得緩存目錄        File cacheFile = getCacheDir();        okHttpClient = new OkHttpClient                .Builder()                .cache(new Cache(cacheFile,4*1024*1024)) //設置緩存目錄和緩存大小                .build();復制代碼注意:緩存目錄最好是私有緩存。一個APP、一個OkHttpClient對象、一個緩存目錄。再次強調對于項目中的OkHttpClient需要是單例的--官方推薦。強制請求網絡(經過測試,此種方式還是會寫入緩存,只是沒有讀取緩存內容)<div>Request request = new Request.Builder()        .cacheControl(new CacheControl.Builder().noCache().build())//設置不讀取緩存,直接進行網絡請求        .url("http://publicobject.com/helloworld.txt")</div><div>        .build();</div>復制代碼強制讀取緩存。也就是不管緩存是否有數據,都不請求網絡。Request request = new Request.Builder()          .cacheControl(new CacheControl.Builder()              .onlyIfCached()              .build())          .url("http://publicobject.com/helloworld.txt")          .build();      Response forceCacheResponse = client.newCall(request).execute();      if (forceCacheResponse.code() != 504) {        // The resource was cached! Show it.      } else {        // The resource was not cached.      }復制代碼強制讀取緩存的第2中寫法(其實內部代碼和上面的寫法一致):Request request = builder.url(Config.URL).cacheControl(CacheControl.FORCE_CACHE).build();                    Response response1 = okHttpClient.newCall(request).execute();                    String result1 = null;                    if (response1.code() != 504) {                        result1 = response1.body().string();                    } else {                        System.out.PRintln("-androidxx--null");                    }復制代碼強制讀取緩存的測試過程:先成功請求一次,然后將網絡斷開,使用強制取緩存的方式,可以將緩存的結果請求到。沒有網絡自動取緩存(默認方式)Request request = builder.url("https://publicobject.com/helloworld.txt").build();                    Response response1 = okHttpClient.newCall(request).execute();復制代碼OkHttp設置了緩存大小和目錄之后,默認的網絡請求方式是如果沒有網絡或者網絡連接失敗,會返回緩存中的信息。OkHttp獲取緩存信息的源碼:(這是OkHttp中Cache類的源碼中的一部分)Response get(Request request) {    String key = urlToKey(request);    DiskLruCache.Snapshot snapshot;    Entry entry;    try {      snapshot = cache.get(key);      if (snapshot == null) {        return null;      }    } catch (IOException e) {      // Give up because the cache cannot be read.      return null;    }復制代碼通過以上源碼,可以看到有一個大家比較熟悉的類DiskLruCache,這就是一個磁盤緩存的工具類,OkHttp中使用的就是DiskLruCache進行的緩存。      如果想直接取緩存信息,可以將源碼中的Cache類的get方法的限定修飾符改成public,然后可以通過如下方式直接讀取緩存內容:Response response = okHttpClient.cache().get(request);//get方法默認是看不到的,需要修改源碼復制代碼總結1、使用緩存功能,一定要先配置緩存目錄和大小。2、在一般情況下,不需要做額外的配置,OkHttp在沒有網絡的情況下,會自動請求緩存信息。但于此同時,網絡請求失敗會出現異常(已經捕獲),通過異常可以做一些邏輯相關的處理。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扶沟县| 中阳县| 锡林郭勒盟| 大关县| 金塔县| 剑河县| 宁远县| 南华县| 达州市| 北辰区| 扶沟县| 荔浦县| 甘谷县| 和林格尔县| 米易县| 武山县| 监利县| 信宜市| 蓝山县| 轮台县| 佛冈县| 亚东县| 天台县| 绵阳市| 视频| 鲁山县| 甘德县| 绩溪县| 中山市| 临清市| 江安县| 泉州市| 齐齐哈尔市| 南城县| 开封县| 通州市| 沅陵县| 资源县| 云安县| 天水市| 游戏|