亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談Android輕量級(jí)的數(shù)據(jù)緩存框架RxCache

 更新時(shí)間:2017年08月26日 10:09:10   作者:i_love_lu  
本篇文章主要介紹了淺談Android輕量級(jí)的數(shù)據(jù)緩存框架RxCache,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

請(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地址

RxCache

開(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)文章

最新評(píng)論