淺談Android輕量級(jí)的數(shù)據(jù)緩存框架RxCache
請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)是在安卓開(kāi)發(fā)中使用最頻繁的一個(gè)功能,網(wǎng)絡(luò)請(qǐng)求的體驗(yàn)決定了用戶(hù)對(duì)整個(gè)APP的感覺(jué),因此合理地使用緩存對(duì)網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)進(jìn)行處理極為重要。合理的進(jìn)行緩存和網(wǎng)絡(luò)請(qǐng)求,可以為APP帶來(lái)更優(yōu)秀的體驗(yàn)。圖片的緩存有Picasso、Glide、Fresco等非常著名的框架,它們極為成熟并且使用廣泛,程序員應(yīng)該做的是使用輪子而非重復(fù)造輪子。但對(duì)于網(wǎng)絡(luò)數(shù)據(jù)的緩存,大多都是自用自封裝,每個(gè)人都需要進(jìn)行繁瑣的編碼工作。RxCache就對(duì)網(wǎng)絡(luò)緩存進(jìn)行了封裝,并采用RxJava模式,可以與其他RxJava的代碼無(wú)縫對(duì)接,使用極為方便。
RxCache使用LruCache和DiskLruCache對(duì)網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)進(jìn)行二級(jí)緩存,主要適配于接口API返回?cái)?shù)據(jù),不用于圖片等的緩存??梢栽O(shè)置緩存模式、緩存大小,設(shè)置數(shù)據(jù)過(guò)期時(shí)間,并提供了根據(jù)key刪除緩存和清空所有緩存的功能。提供了Gson方式和Serialize方式進(jìn)行數(shù)據(jù)存儲(chǔ)轉(zhuǎn)換與還原。
項(xiàng)目GitHub地址
開(kāi)始使用:
首先在項(xiàng)目的Gradle中添加依賴(lài):
RxCache使用JitPack進(jìn)行依賴(lài)管理,所以需要先在項(xiàng)目的build.gradle中添加以下代碼:
allprojects{ repositories{ ... maven{url 'https://jitpack.io'} } }
然后在Module的gradle中添加以下依賴(lài):
compile 'com.github.LtLei:RxCache:v1.0.0'
在你的Application中進(jìn)行初始化:
RxCache.init(this);//為RxCache提供Context
也可以使用Builder進(jìn)行高級(jí)初始化:
new RxCache.Builder() .setDebug(true) //開(kāi)啟debug,開(kāi)啟后會(huì)打印緩存相關(guān)日志,默認(rèn)為true .setConverter(new GsonConverter()) //設(shè)置轉(zhuǎn)換方式,默認(rèn)為Gson轉(zhuǎn)換 .setCacheMode(CacheMode.BOTH) //設(shè)置緩存模式,默認(rèn)為二級(jí)緩存 .setMemoryCacheSizeByMB(50) //設(shè)置內(nèi)存緩存的大小,單位是MB .setDiskCacheSizeByMB(100) //設(shè)置磁盤(pán)緩存的大小,單位是MB .setDiskDirName("RxCache") //設(shè)置磁盤(pán)緩存的文件夾名稱(chēng) .build();
寫(xiě)入緩存
RxCache.getInstance() .put("test", "This is data to cache.", 10 * 1000) //key:緩存的key data:具體的數(shù)據(jù) time:緩存的有效時(shí)間 .compose(RxUtil.<Boolean>io_main()) //線(xiàn)程調(diào)度 .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(); } });
讀取緩存
讀取緩存時(shí),分為以下幾種情況:
若為Gson轉(zhuǎn)換時(shí):
讀取基本類(lèi)型數(shù)據(jù),或自定義的javabean數(shù)據(jù),或數(shù)組數(shù)據(jù)等一切可以獲取.class的數(shù)據(jù)
RxCache.getInstance() .get("test",false,String.class) //key:緩存的key update:表示從緩存獲取數(shù)據(jù)強(qiáng)行返回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等無(wú)法獲取.class的數(shù)據(jù),以上基本數(shù)據(jù)也可以使用此方式
Type type = new TypeToken<List<String>>(){}.getType(); RxCache.getInstance() .<List<String>>get("test",false,type) //由于Type不是類(lèi),需要指定泛型 .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方式時(shí),則統(tǒng)一使用以下方法即可:
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(); } });
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android多媒體應(yīng)用使用MediaPlayer播放音頻
這篇文章主要為大家詳細(xì)介紹了Android多媒體應(yīng)用使用MediaPlayer播放音頻,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12關(guān)于Android Fragment對(duì)回退棧的詳細(xì)理解
這篇文章主要介紹了Android Fragment的回退棧示例詳細(xì)介紹的相關(guān)資料,在Android中Fragment回退棧是由Activity管理的,每個(gè)Activity都有自己的回退棧,其中保存了已經(jīng)停止(處于后臺(tái))的Fragment實(shí)例,需要的朋友可以參考下2016-12-12Flutter開(kāi)發(fā)技巧ListView去除水波紋方法示例
這篇文章主要為大家介紹了Flutter開(kāi)發(fā)技巧ListView去除水波紋方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android ScrollView的頂部下拉和底部上拉回彈效果
本篇文章主要介紹了Android ScrollView的頂部下拉和底部上拉回彈效果,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05autojs模仿QQ長(zhǎng)按彈窗菜單實(shí)現(xiàn)示例詳解二
這篇文章主要為大家介紹了autojs模仿QQ長(zhǎng)按彈窗菜單實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android MarkTipsView文字標(biāo)識(shí)控件使用方法
這篇文章主要為大家詳細(xì)介紹了Android MarkTipsView文字標(biāo)識(shí)控件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Android BroadcastReceiver廣播注冊(cè)方式總結(jié)
這篇文章主要介紹了Android BroadcastReceiver廣播注冊(cè)方式總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-01-01