浅谈Android轻量级的数据缓存框架RxCache

所属分类: 软件编程 / Android 阅读数: 39
收藏 0 赞 0 分享

请求网络数据是在安卓开发中使用最频繁的一个功能,网络请求的体验决定了用户对整个APP的感觉,因此合理地使用缓存对网络请求的数据进行处理极为重要。合理的进行缓存和网络请求,可以为APP带来更优秀的体验。图片的缓存有Picasso、Glide、Fresco等非常著名的框架,它们极为成熟并且使用广泛,程序员应该做的是使用轮子而非重复造轮子。但对于网络数据的缓存,大多都是自用自封装,每个人都需要进行繁琐的编码工作。RxCache就对网络缓存进行了封装,并采用RxJava模式,可以与其他RxJava的代码无缝对接,使用极为方便。

RxCache使用LruCache和DiskLruCache对网络请求数据进行二级缓存,主要适配于接口API返回数据,不用于图片等的缓存。可以设置缓存模式、缓存大小,设置数据过期时间,并提供了根据key删除缓存和清空所有缓存的功能。提供了Gson方式和Serialize方式进行数据存储转换与还原。

项目GitHub地址

RxCache

开始使用:

首先在项目的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,开启后会打印缓存相关日志,默认为true
  .setConverter(new GsonConverter()) //设置转换方式,默认为Gson转换
  .setCacheMode(CacheMode.BOTH)  //设置缓存模式,默认为二级缓存
  .setMemoryCacheSizeByMB(50)  //设置内存缓存的大小,单位是MB
  .setDiskCacheSizeByMB(100)  //设置磁盘缓存的大小,单位是MB
  .setDiskDirName("RxCache")  //设置磁盘缓存的文件夹名称
  .build();

写入缓存

RxCache.getInstance()
  .put("test", "This is data to cache.", 10 * 1000)  //key:缓存的key data:具体的数据 time:缓存的有效时间
  .compose(RxUtil.<Boolean>io_main()) //线程调度
  .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转换时:

读取基本类型数据,或自定义的javabean数据,或数组数据等一切可以获取.class的数据

RxCache.getInstance()
  .get("test",false,String.class)  //key:缓存的key update:表示从缓存获取数据强行返回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的数据,以上基本数据也可以使用此方式

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方式时,则统一使用以下方法即可:

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();
    }
  });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android studio点击跳转WebView详解

这篇文章主要为大家详细介绍了Android studio点击跳转WebView的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义Drawable实现圆形和圆角

这篇文章主要为大家详细介绍了Android自定义Drawable实现圆形和圆角,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义水平渐变进度条

这篇文章主要为大家详细介绍了Android自定义水平渐变进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

ToolBar中menu无法同时显示图标和文字问题的解决方法

这篇文章主要为大家详细介绍了ToolBar中menu无法同时显示图标和文字问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解React Native监听Android回退按键与程序化退出应用

这篇文章主要介绍了详解React Native监听Android回退按键与程序化退出应用的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
收藏 0 赞 0 分享

android实现上传本地图片到网络功能

这篇文章主要为大家详细介绍了android实现上传本地图片到网络功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android实现QQ登录功能

这篇文章主要为大家详细介绍了Android实现QQ登录功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android实现简单的城市列表功能

这篇文章主要为大家详细介绍了Android实现简单的城市列表功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android Animation之TranslateAnimation(平移动画)

这篇文章主要为大家详细介绍了Animation之TranslateAnimation平移动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android 中Failed to read key from keystore解决办法

这篇文章主要介绍了Android 中Failed to read key from keystore解决办法的相关资料,希望通过本能帮助到大家,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多