淺談Android輕量級的數(shù)據(jù)緩存框架RxCache
請求網(wǎng)絡(luò)數(shù)據(jù)是在安卓開發(fā)中使用最頻繁的一個功能,網(wǎng)絡(luò)請求的體驗決定了用戶對整個APP的感覺,因此合理地使用緩存對網(wǎng)絡(luò)請求的數(shù)據(jù)進行處理極為重要。合理的進行緩存和網(wǎng)絡(luò)請求,可以為APP帶來更優(yōu)秀的體驗。圖片的緩存有Picasso、Glide、Fresco等非常著名的框架,它們極為成熟并且使用廣泛,程序員應(yīng)該做的是使用輪子而非重復(fù)造輪子。但對于網(wǎng)絡(luò)數(shù)據(jù)的緩存,大多都是自用自封裝,每個人都需要進行繁瑣的編碼工作。RxCache就對網(wǎng)絡(luò)緩存進行了封裝,并采用RxJava模式,可以與其他RxJava的代碼無縫對接,使用極為方便。
RxCache使用LruCache和DiskLruCache對網(wǎng)絡(luò)請求數(shù)據(jù)進行二級緩存,主要適配于接口API返回數(shù)據(jù),不用于圖片等的緩存。可以設(shè)置緩存模式、緩存大小,設(shè)置數(shù)據(jù)過期時間,并提供了根據(jù)key刪除緩存和清空所有緩存的功能。提供了Gson方式和Serialize方式進行數(shù)據(jù)存儲轉(zhuǎn)換與還原。
項目GitHub地址
開始使用:
首先在項目的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,開啟后會打印緩存相關(guān)日志,默認為true
.setConverter(new GsonConverter()) //設(shè)置轉(zhuǎn)換方式,默認為Gson轉(zhuǎn)換
.setCacheMode(CacheMode.BOTH) //設(shè)置緩存模式,默認為二級緩存
.setMemoryCacheSizeByMB(50) //設(shè)置內(nèi)存緩存的大小,單位是MB
.setDiskCacheSizeByMB(100) //設(shè)置磁盤緩存的大小,單位是MB
.setDiskDirName("RxCache") //設(shè)置磁盤緩存的文件夾名稱
.build();
寫入緩存
RxCache.getInstance()
.put("test", "This is data to cache.", 10 * 1000) //key:緩存的key data:具體的數(shù)據(jù) time:緩存的有效時間
.compose(RxUtil.<Boolean>io_main()) //線程調(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();
}
});
讀取緩存
讀取緩存時,分為以下幾種情況:
若為Gson轉(zhuǎn)換時:
讀取基本類型數(shù)據(jù),或自定義的javabean數(shù)據(jù),或數(shù)組數(shù)據(jù)等一切可以獲取.class的數(shù)據(jù)
RxCache.getInstance()
.get("test",false,String.class) //key:緩存的key update:表示從緩存獲取數(shù)據(jù)強行返回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的數(shù)據(jù),以上基本數(shù)據(jù)也可以使用此方式
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方式時,則統(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();
}
});
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 實現(xiàn)秒轉(zhuǎn)換成時分秒的方法
這篇文章主要介紹了Android 實現(xiàn)秒轉(zhuǎn)換成時分秒的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Android開發(fā)之完成登陸界面的數(shù)據(jù)保存回顯操作實例
這篇文章主要介紹了Android開發(fā)之完成登陸界面的數(shù)據(jù)保存回顯操作實現(xiàn)方法,結(jié)合完整實例形式較為詳細的分析了Android針對登錄數(shù)據(jù)的保存及回顯操作技巧,需要的朋友可以參考下2015-12-12
Android 通過httppost上傳文本文件到服務(wù)器的實例代碼
這篇文章主要介紹了Android 通過httppost上傳文本文件到服務(wù)器的實例代碼,非常簡單易懂,非常實用,需要的朋友可以參考下2016-08-08
android 使用 IJKPlayer 播放視頻流的實現(xiàn)代碼
這篇文章主要介紹了android 使用 IJKPlayer 播放視頻流,這需要借助 IAndroidIO 這個接口,也可以用于播放本地文件,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11
Android監(jiān)聽滑動控件實現(xiàn)狀態(tài)欄顏色切換
這篇文章給大家分享一個平時在滑動頁面經(jīng)常遇到的效果:滑動過程動態(tài)修改狀態(tài)欄顏色,文中有詳細的示例代碼,對我們的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴自己動手試試吧2023-08-08
利用源碼編譯Android系統(tǒng)的APK和可執(zhí)行命令的方法
這篇文章主要介紹了利用源碼編譯Android系統(tǒng)的APK和可執(zhí)行命令的方法,示例在Linux系統(tǒng)環(huán)境上進行構(gòu)建,需要的朋友可以參考下2016-02-02
Android中系統(tǒng)默認輸入法設(shè)置的方法(輸入法的顯示和隱藏)
這篇文章主要介紹了Android中系統(tǒng)默認輸入法設(shè)置的方法(輸入法的顯示和隱藏)的相關(guān)資料,需要的朋友可以參考下2016-01-01

