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

首頁 > 系統 > Android > 正文

淺談Android輕量級的數據緩存框架RxCache

2019-10-22 18:29:18
字體:
來源:轉載
供稿:網友

請求網絡數據是在安卓開發中使用最頻繁的一個功能,網絡請求的體驗決定了用戶對整個APP的感覺,因此合理地使用緩存對網絡請求的數據進行處理極為重要。合理的進行緩存和網絡請求,可以為APP帶來更優秀的體驗。圖片的緩存有Picasso、Glide、Fresco等非常著名的框架,它們極為成熟并且使用廣泛,程序員應該做的是使用輪子而非重復造輪子。但對于網絡數據的緩存,大多都是自用自封裝,每個人都需要進行繁瑣的編碼工作。RxCache就對網絡緩存進行了封裝,并采用RxJava模式,可以與其他RxJava的代碼無縫對接,使用極為方便。

RxCache使用LruCache和DiskLruCache對網絡請求數據進行二級緩存,主要適配于接口API返回數據,不用于圖片等的緩存。可以設置緩存模式、緩存大小,設置數據過期時間,并提供了根據key刪除緩存和清空所有緩存的功能。提供了Gson方式和Serialize方式進行數據存儲轉換與還原。

項目GitHub地址

RxCache

開始使用:

首先在項目的Gradle中添加依賴:

RxCache使用JitPack進行依賴管理,所以需要先在項目的build.gradle中添加以下代碼:

allprojects{  repositories{    ...    maven{url 'https://jitpack.io'}  }}

然后在Module的gradle中添加以下依賴:

compile 'com.github.LtLei:RxCache:v1.0.0'

在你的Application中進行初始化:

RxCache.init(this);//為RxCache提供Context

也可以使用Builder進行高級初始化:

new RxCache.Builder()  .setDebug(true)  //開啟debug,開啟后會打印緩存相關日志,默認為true  .setConverter(new GsonConverter()) //設置轉換方式,默認為Gson轉換  .setCacheMode(CacheMode.BOTH)  //設置緩存模式,默認為二級緩存  .setMemoryCacheSizeByMB(50)  //設置內存緩存的大小,單位是MB  .setDiskCacheSizeByMB(100)  //設置磁盤緩存的大小,單位是MB  .setDiskDirName("RxCache")  //設置磁盤緩存的文件夾名稱  .build();

寫入緩存

RxCache.getInstance()  .put("test", "This is data to cache.", 10 * 1000)  //key:緩存的key data:具體的數據 time:緩存的有效時間  .compose(RxUtil.<Boolean>io_main()) //線程調度  .subscribe(new Consumer<Boolean>() {    @Override    public void accept(Boolean aBoolean) throws Exception {      if (aBoolean) Log.d("Cache", "cache successful!");    }  },new Consumer<Throwable>() {    @Override    public void accept(Throwable throwable) throws Exception {      throwable.printStackTrace();    }  });

讀取緩存

讀取緩存時,分為以下幾種情況:

若為Gson轉換時:

讀取基本類型數據,或自定義的javabean數據,或數組數據等一切可以獲取.class的數據

RxCache.getInstance()  .get("test",false,String.class)  //key:緩存的key update:表示從緩存獲取數據強行返回NULL  .compose(RxUtil.<CacheResponse<String>>io_main())  .subscribe(new Consumer<CacheResponse<String>>() {    @Override    public void accept(CacheResponse<String> stringCacheResponse) throws Exception {      if(stringCacheResponse.getData()!=null)        Log.d("data from cache : "+stringCacheResponse.getData());    }  },new Consumer<Throwable>() {    @Override    public void accept(Throwable throwable) throws Exception {      throwable.printStackTrace();    }  });

讀取List等無法獲取.class的數據,以上基本數據也可以使用此方式

Type type = new TypeToken<List<String>>(){}.getType();RxCache.getInstance()  .<List<String>>get("test",false,type)  //由于Type不是類,需要指定泛型  .compose(RxUtil.<CacheResponse<List<String>>>io_main())  .subscribe(new Consumer<CacheResponse<List<String>>>() {    @Override    public void accept(CacheResponse<List<String>> listCacheResponse) throws Exception {      if(listCacheResponse.getData()!=null)        Log.d("data from cache : "+listCacheResponse.getData().toString());    }  },new Consumer<Throwable>() {    @Override    public void accept(Throwable throwable) throws Exception {      throwable.printStackTrace();    }  });

若為Serialize方式時,則統一使用以下方法即可:

RxCache.getInstance()  .<List<String>>get("test",false)  //指定泛型,不再需要傳.class或Type  .compose(RxUtil.<CacheResponse<List<String>>>io_main())  .subscribe(new Consumer<CacheResponse<List<String>>>() {    @Override    public void accept(CacheResponse<List<String>> listCacheResponse) throws Exception {      if(listCacheResponse.getData()!=null)        Log.d("data from cache : "+listCacheResponse.getData().toString());    }  },new Consumer<Throwable>() {    @Override    public void accept(Throwable throwable) throws Exception {      throwable.printStackTrace();    }  });

清除指定緩存

RxCache.getInstance()  .remove("testList")  .compose(RxUtil.<Boolean>io_main())  .subscribe(new Consumer<Boolean>() {    @Override    public void accept(Boolean aBoolean) throws Exception {      if (aBoolean) Log.d("cache data has been deleted.");    }  }, new Consumer<Throwable>() {    @Override    public void accept(Throwable throwable) throws Exception {      throwable.printStackTrace();    }  });

清除全部緩存

RxCache.getInstance()  .clear()  .compose(RxUtil.<Boolean>io_main())  .subscribe(new Consumer<Boolean>() {    @Override    public void accept(Boolean aBoolean) throws Exception {      if (aBoolean) Log.d("All datas has been deleted.");    }  }, new Consumer<Throwable>() {    @Override    public void accept(Throwable throwable) throws Exception {      throwable.printStackTrace();    }  });

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 深水埗区| 浦东新区| 新邵县| 隆尧县| 睢宁县| 长垣县| 沾益县| 仪征市| 衡水市| 土默特左旗| 盐池县| 楚雄市| 玉溪市| 乌兰县| 嘉义县| 荔波县| 遂宁市| 双峰县| 鹤壁市| 高青县| 新绛县| 余姚市| 榆林市| 苍山县| 鹿泉市| 合山市| 武强县| 克山县| 揭西县| 措勤县| 阿荣旗| 洪泽县| 湛江市| 鲁甸县| 东兰县| 综艺| 衡阳市| 乳山市| 新竹县| 淮阳县| 蒙自县|