欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Android RxCache使用方法詳解

 更新時(shí)間:2018年01月20日 11:26:27   作者:卻把清梅嗅  
下面小編就為大家分享一篇基于Android RxCache使用方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

前言

我為什么使用這個(gè)庫(kù)?

事實(shí)上Android開發(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)樗褂闷饋硐鄬?duì)簡(jiǎn)單),我可能需要很多的靜態(tài)常量來作為key存儲(chǔ)緩存數(shù)據(jù)value,并設(shè)置緩存的有效期,這可能需要很多Java代碼去實(shí)現(xiàn),并且過程繁瑣。

如果您使用的網(wǎng)絡(luò)請(qǐng)求庫(kù)是Retrofit+RxJava,那么我推薦使用RxCache,正如作者所說的:

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è)接口。

為什么寫這樣一篇文章

因?yàn)檫@個(gè)庫(kù)的官方文檔是!英!語!的!

這本身無可厚非,作為一個(gè)開發(fā)者,英語文檔的閱讀是不可避免的一項(xiàng)技能,但是筆者還是抽了一點(diǎn)時(shí)間將官方文檔做了漢化:

RxCache官方文檔中文翻譯

RxCache庫(kù)官方鏈接

文檔的翻譯比想象中的費(fèi)力(每一個(gè)詞都試圖翻譯準(zhǔn)確),但數(shù)小時(shí)的努力之后,譯文的描述依然對(duì)于初次接觸該庫(kù)的開發(fā)者有著不小的學(xué)習(xí)難度,干脆自己寫一個(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è)依賴,下面有說明
  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è)需求,通過傳入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)單,接下來我們來配置緩存,我們默認(rèn)需求:緩存有效期為1分鐘。

3.緩存配置

配置緩存接口

首先我們先配置Provider接口:

public interface UserCacheProviders {
  /**
   * LifeCache設(shè)置緩存過期時(shí)間. 如果沒有設(shè)置@LifeCache , 數(shù)據(jù)將被永久緩存理除非你使用了 EvictProvider,EvictDynamicKey or EvictDynamicKeyGroup .
   * @param user
   * @param userName 驅(qū)逐與一個(gè)特定的鍵使用EvictDynamicKey相關(guān)的數(shù)據(jù)。比如分頁,排序或篩選要求
   * @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ù)都是用來干嘛的,其實(shí)簡(jiǎn)單介紹一下就清楚了:

@param user:這是個(gè)Observable類型的對(duì)象,簡(jiǎn)單來說,這就是你將要緩存的數(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)求(即使緩存沒有過期)。如果傳入為false,說明不驅(qū)逐緩存數(shù)據(jù),如果緩存數(shù)據(jù)沒有過期,那么就不請(qǐng)求網(wǎng)絡(luò),直接讀取緩存數(shù)據(jù)返回。
@return 可以看到,該接口方法中,返回值為Observable,泛型為user,這個(gè)Observable的對(duì)象user和參數(shù)中傳進(jìn)來的Observable的對(duì)象user有什么區(qū)別呢? 
— 很簡(jiǎn)單,返回值Observable中的數(shù)據(jù)為經(jīng)過緩存處理的數(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());
}

配置好后,如果沒有緩存或者緩存失效,則請(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開發(fā)自學(xué)筆記(三):APP布局上

    Android開發(fā)自學(xué)筆記(三):APP布局上

    這篇文章主要介紹了Android開發(fā)自學(xué)筆記(三):APP布局上,本文講解了添加ViewGroup、添加ViewGroup、定義string內(nèi)容、添加Button、運(yùn)行程序查看效果等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Android Studio3.2中導(dǎo)出jar包的過程詳解

    Android Studio3.2中導(dǎo)出jar包的過程詳解

    這篇文章主要介紹了Android Studio3.2中導(dǎo)出jar包的過程,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 跨平臺(tái)移動(dòng)WEB應(yīng)用開發(fā)框架iMAG入門教程

    跨平臺(tái)移動(dòng)WEB應(yīng)用開發(fā)框架iMAG入門教程

    這篇文章主要介紹了跨平臺(tái)移動(dòng)WEB應(yīng)用開發(fā)框架iMAG入門教程,iMAG最大的特點(diǎn)是生成各移動(dòng)平臺(tái)的原生代碼,需要的朋友可以參考下
    2014-07-07
  • Android 使用gradle打包Assets目錄的案例

    Android 使用gradle打包Assets目錄的案例

    這篇文章主要介紹了Android 使用gradle打包Assets目錄的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Android在ubuntu上過濾多條關(guān)鍵字日志

    Android在ubuntu上過濾多條關(guān)鍵字日志

    今天小編就為大家分享一篇關(guān)于Android在ubuntu上過濾多條關(guān)鍵字日志,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Android 仿支付寶密碼輸入框效果

    Android 仿支付寶密碼輸入框效果

    模仿支付寶輸入效果,實(shí)現(xiàn)很簡(jiǎn)單,就是畫個(gè)矩形框和圓形,其他的通過組合view來實(shí)現(xiàn)所有功能,雖然簡(jiǎn)單但是封裝起來,方便以后使用,也分享一下
    2016-12-12
  • 舉例講解Android應(yīng)用開發(fā)中OTTO框架的基本使用

    舉例講解Android應(yīng)用開發(fā)中OTTO框架的基本使用

    這篇文章主要介紹了Android應(yīng)用開發(fā)中OTTO框架的基本使用講解,文中舉了創(chuàng)建一個(gè)單例模式的應(yīng)用例子,需要的朋友可以參考下
    2016-02-02
  • 詳解四種主要的Android依賴管理方式

    詳解四種主要的Android依賴管理方式

    Android應(yīng)用開發(fā)涉及大量的依賴庫(kù)和第三方組件,因此有效地管理這些依賴關(guān)系至關(guān)重要,本文將介紹四種主要的Android依賴管理方式,分析它們的優(yōu)點(diǎn)、缺點(diǎn)以及最佳實(shí)踐,需要的朋友可以參考下
    2023-09-09
  • Android中使用protobuf的具體示例

    Android中使用protobuf的具體示例

    本篇文章主要介紹了Android中使用protobuf的具體示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Android?Activity通用懸浮可拖拽View封裝的思路詳解

    Android?Activity通用懸浮可拖拽View封裝的思路詳解

    這篇文章主要介紹了Android?Activity通用懸浮可拖拽View封裝,實(shí)現(xiàn)思路是通過封裝通用的基礎(chǔ)懸浮View,繼承通用View,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07

最新評(píng)論