基于Android RxCache使用方法詳解
前言
我為什么使用這個(gè)庫(kù)?
事實(shí)上Android開(kāi)發(fā)中緩存功能的實(shí)現(xiàn)選擇有很多種,F(xiàn)ile緩存,SP緩存,或者數(shù)據(jù)庫(kù)緩存,當(dāng)然還有一些簡(jiǎn)單的庫(kù)/工具類,比如github上的這個(gè):
【ASimpleCache】:a simple cache for android and java
但是都不是很好用(雖然可能學(xué)習(xí)成本比較低,因?yàn)樗褂闷饋?lái)相對(duì)簡(jiǎn)單),我可能需要很多的靜態(tài)常量來(lái)作為key存儲(chǔ)緩存數(shù)據(jù)value,并設(shè)置緩存的有效期,這可能需要很多Java代碼去實(shí)現(xiàn),并且過(guò)程繁瑣。
如果您使用的網(wǎng)絡(luò)請(qǐng)求庫(kù)是Retrofit+RxJava,那么我推薦使用RxCache,正如作者所說(shuō)的:
RxCache is a reactive caching library for Android and Java which turns your caching needs into an interface. RxCache是一個(gè)用于Android和Java的響應(yīng)式緩存庫(kù),它可將您的緩存需求轉(zhuǎn)換為一個(gè)接口。
為什么寫(xiě)這樣一篇文章
因?yàn)檫@個(gè)庫(kù)的官方文檔是!英!語(yǔ)!的!
這本身無(wú)可厚非,作為一個(gè)開(kāi)發(fā)者,英語(yǔ)文檔的閱讀是不可避免的一項(xiàng)技能,但是筆者還是抽了一點(diǎn)時(shí)間將官方文檔做了漢化:
RxCache官方文檔中文翻譯
文檔的翻譯比想象中的費(fèi)力(每一個(gè)詞都試圖翻譯準(zhǔn)確),但數(shù)小時(shí)的努力之后,譯文的描述依然對(duì)于初次接觸該庫(kù)的開(kāi)發(fā)者有著不小的學(xué)習(xí)難度,干脆自己寫(xiě)一個(gè)demo,并放到github上,供大家參考。
【Github】本文demo源碼,點(diǎn)擊進(jìn)入
1.依賴配置
在您的build.gradle(Project)中添加JitPack倉(cāng)庫(kù):
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
將下列的依賴添加到Module的build.gradle中:
dependencies {
compile "com.github.VictorAlbertos.RxCache:runtime:1.8.1-2.x"
compile "io.reactivex.rxjava2:rxjava:2.0.6"
//我們?cè)偬砑舆@個(gè)依賴,下面有說(shuō)明
compile 'com.github.VictorAlbertos.Jolyglot:gson:0.0.3'
}
因?yàn)镽xCache在內(nèi)部使用 Jolyglot 對(duì)對(duì)象進(jìn)行序列化和反序列化, 您需要選擇下列的依賴中選擇一個(gè)進(jìn)行添加:
dependencies {
// To use Gson
compile 'com.github.VictorAlbertos.Jolyglot:gson:0.0.3'
// To use Jackson
compile 'com.github.VictorAlbertos.Jolyglot:jackson:0.0.3'
// To use Moshi
compile 'com.github.VictorAlbertos.Jolyglot:moshi:0.0.3'
}
2.Retrofit請(qǐng)求示例
我們假設(shè)這樣一個(gè)需求,通過(guò)傳入user名,返回User對(duì)應(yīng)信息,比如:
Retrofit API接口
public interface GitHubService {
@GET("users/{user}")
Observable<User> getRxUser(@Path("user") String user);
}
該API請(qǐng)求的管理類ServiceManager
public class GitHubServiceManager {
private GitHubService service;
public GitHubServiceManager() {
init();
}
private void init() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient()
.newBuilder()
.addInterceptor(interceptor)
.build();
service = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build()
.create(GitHubService.class);
}
public Observable<User> getUser(String user){
return service.getRxUser(user);
}
}
User數(shù)據(jù)類
@Data //lombok插件的注解,自動(dòng)生成get、set方法
public class User {
public String login;
public String name;
}
最后在我們的Activity中獲取數(shù)據(jù):
new GitHubServiceManager()
.getUser(userName)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(user1 -> Toast.makeText(this, user1.toString(), Toast.LENGTH_SHORT).show());
ok,非常簡(jiǎn)單,接下來(lái)我們來(lái)配置緩存,我們默認(rèn)需求:緩存有效期為1分鐘。
3.緩存配置
配置緩存接口
首先我們先配置Provider接口:
public interface UserCacheProviders {
/**
* LifeCache設(shè)置緩存過(guò)期時(shí)間. 如果沒(méi)有設(shè)置@LifeCache , 數(shù)據(jù)將被永久緩存理除非你使用了 EvictProvider,EvictDynamicKey or EvictDynamicKeyGroup .
* @param user
* @param userName 驅(qū)逐與一個(gè)特定的鍵使用EvictDynamicKey相關(guān)的數(shù)據(jù)。比如分頁(yè),排序或篩選要求
* @param evictDynamicKey 可以明確地清理指定的數(shù)據(jù) DynamicKey.
* @return
*/
@LifeCache(duration = 1,timeUnit = TimeUnit.MINUTES)
Observable<User> getUser(Observable<User> user, DynamicKey userName, EvictDynamicKey evictDynamicKey);
}
很多同學(xué)到這里就有點(diǎn)蒙蒙的,不知道這些參數(shù)都是用來(lái)干嘛的,其實(shí)簡(jiǎn)單介紹一下就清楚了:
@param user:這是個(gè)Observable類型的對(duì)象,簡(jiǎn)單來(lái)說(shuō),這就是你將要緩存的數(shù)據(jù)對(duì)象。 @param userName:DynamicKey類型,顧名思義,就是一個(gè)動(dòng)態(tài)的key,我們以它作為tag,將數(shù)據(jù)存儲(chǔ)到對(duì)應(yīng)名字的File中 @param evictDynamicKey 可以明確地清理指定的數(shù)據(jù) ,很簡(jiǎn)單,如果我們?cè)搮?shù)傳入為true,那么RxCache就會(huì)驅(qū)逐對(duì)應(yīng)的緩存數(shù)據(jù)直接進(jìn)行網(wǎng)絡(luò)的新一次請(qǐng)求(即使緩存沒(méi)有過(guò)期)。如果傳入為false,說(shuō)明不驅(qū)逐緩存數(shù)據(jù),如果緩存數(shù)據(jù)沒(méi)有過(guò)期,那么就不請(qǐng)求網(wǎng)絡(luò),直接讀取緩存數(shù)據(jù)返回。 @return 可以看到,該接口方法中,返回值為Observable,泛型為user,這個(gè)Observable的對(duì)象user和參數(shù)中傳進(jìn)來(lái)的Observable的對(duì)象user有什么區(qū)別呢? — 很簡(jiǎn)單,返回值Observable中的數(shù)據(jù)為經(jīng)過(guò)緩存處理的數(shù)據(jù)。
配置緩存Provider
我們還需要配置的有:
1.緩存文件存儲(chǔ)到哪里?
2.如何解析緩存數(shù)據(jù)?
public class CacheProviders {
private static UserCacheProviders userCacheProviders;
public synchronized static UserCacheProviders getUserCache() {
if (userCacheProviders == null) {
userCacheProviders = new RxCache.Builder()
.persistence(BaseApplication.getApplication().getExternalCacheDir(), new GsonSpeaker())//緩存文件的配置、數(shù)據(jù)的解析配置
.using(UserCacheProviders.class);//這些配置對(duì)應(yīng)的緩存接口
}
return userCacheProviders;
}
}
代碼中設(shè)置緩存功能:
private void requestHttp(String userName) {
//網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)
Observable<User> user = new GitHubServiceManager()
.getUser(userName);
//緩存配置
CacheProviders.getUserCache()
.getUser(user, new DynamicKey(userName), new EvictDynamicKey(false))//用戶名作為動(dòng)態(tài)key生成不同文件存儲(chǔ)數(shù)據(jù),默認(rèn)不清除緩存數(shù)據(jù)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(user1 -> Toast.makeText(this, user1.toString(), Toast.LENGTH_SHORT).show());
}
配置好后,如果沒(méi)有緩存或者緩存失效,則請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù),緩存并展示數(shù)據(jù)。
如果有緩存數(shù)據(jù)且緩存未失效,則不加載網(wǎng)絡(luò)數(shù)據(jù),直接展示本地緩存數(shù)據(jù)。
以上這篇基于Android RxCache使用方法詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android基礎(chǔ)開(kāi)發(fā)小案例之短信發(fā)送器
這篇文章主要為大家詳細(xì)介紹了Android基礎(chǔ)開(kāi)發(fā)小案例之短信發(fā)送器的具體實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下2016-05-05
Android實(shí)現(xiàn)RecyclerView添加分割線的簡(jiǎn)便方法
這篇文章主要介紹了Android實(shí)現(xiàn)RecyclerView添加分割線的簡(jiǎn)便方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Android如何創(chuàng)建自定義ActionBar
這篇文章主要教大家如何創(chuàng)建自定義的ActionBar,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Android自定義星星可滑動(dòng)評(píng)分控件
這篇文章主要介紹了Android自定義星星可滑動(dòng)評(píng)分控件,通過(guò)線性布局結(jié)合ImageView實(shí)現(xiàn)評(píng)分控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Android開(kāi)發(fā)實(shí)現(xiàn)仿QQ消息SwipeMenuListView滑動(dòng)刪除置頂功能【附源碼下載】
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)仿QQ消息SwipeMenuListView滑動(dòng)刪除置頂功能,結(jié)合實(shí)例形式分析了Android swipemenulistview相關(guān)組件的使用技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-12-12
詳解如何實(shí)現(xiàn)一個(gè)Kotlin函數(shù)類型
這篇文章主要為大家詳細(xì)介紹了如何實(shí)現(xiàn)一個(gè)Kotlin函數(shù)類型,文中的實(shí)現(xiàn)方法講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-10-10
Android中的TimePickerView(時(shí)間選擇器)的用法詳解
這篇文章主要介紹了Android中的TimePickerView時(shí)間選擇器的用法,這是一個(gè)第三方從底部彈出來(lái)的日期選擇器,文中結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
Android開(kāi)發(fā)雙向滑動(dòng)選擇器范圍SeekBar實(shí)現(xiàn)
這篇文章主要為大家介紹了Android開(kāi)發(fā)雙向滑動(dòng)范圍選擇器SeekBar實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

