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

请求网络数据是在安卓开发中使用最频繁的一个功能,网络请求的体验决定了用户对整个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();
    }
  });

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

(0)

相关推荐

  • android开发教程之清除android数据缓存示例(清除本地数据缓存)

    复制代码 代码如下: /*  * 文 件 名:  DataCleanManager.java  * 描    述:  主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录  */ import java.io.File;import android.content.Context;import android.os.Environment; /** * 本应用数据清除管理器 */public class DataCleanManager { 

  • Android中如何加载数据缓存

    最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据 首先做一个保存缓存的工具类 import java.io.File; import java.io.IOException; import android.content.Context; import android.os.Environment; import android.util.Log; /** * 缓存工具类 */ public class Co

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

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

  • 浅谈Android为RecyclerView增加监听以及数据混乱的小坑

    为 RecyclerView增加监听 1.在实现好的MyAdapter中写内部接口: public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { this.onItemLongClickListener = onItemLongClickListener; } public void setOnItemClickListener(OnItemClickListener onIt

  • Android数据缓存框架内置ORM功能使用教程

    目录 使用教程如下 配置初始化 注解详解 CRUD操作 其他注意事项 使用教程如下 配置初始化 Orm.init(this, OrmConfig.Builder() .database("dcache_sample") .tables(Account::class.java) .version(1) .build()) 在自定义的Application类的入口加入一行配置,database为数据库名,version从1开始每次递增1,tables用来配置需要初始化的表,dcache中所

  • 浅谈php常用的7大框架的优缺点

    一直以来,phper讨论最多的就是php各种框架的优缺点,网上的资料也是比较零散,现把几款主流的框架收集汇总一下,其中本人只是用过Yii2.Laravel.Yaf.Thinkphp这四种框架,因此大部分对各种框架的评价皆来自与网上资料,如果问题,请在评论中指出,共同进步 一.ThinkPHP ThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架.它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟

  • 浅谈Android性能优化之内存优化

    1.Android内存管理机制 1.1 Java内存分配模型 先上一张JVM将内存划分区域的图 程序计数器:存储当前线程执行目标方法执行到第几行. 栈内存:Java栈中存放的是一个个栈帧,每个栈帧对应一个被调用的方法.栈帧包括局部标量表, 操作数栈. 本地方法栈:本地方法栈主要是为执行本地方法服务的.而Java栈是为执行Java方法服务的. 方法区:该区域被线程共享.主要存储每个类的信息(类名,方法信息,字段信息等).静态变量,常量,以及编译器编译后的代码等. 堆:Java中的堆是被线程共享的,

  • 浅谈Ajax请求与浏览器缓存

    在现代Web应用程序中,前端代码充斥着大量的Ajax请求,如果对于Ajax请求可以使用浏览器缓存,那么可以显著地减少网络请求,提高程序响应速度. 1. Ajax Request 使用jQuery框架可以很方便的进行Ajax请求,示例代码如下: $.ajax({ url : 'url', dataType : "xml", cache: true, success : function(xml, status){ } }); 非常简单,注意其中的第4行代码:cache:true,显式的要

  • 浅谈android获取设备唯一标识完美解决方案

    本文介绍了浅谈android获取设备唯一标识完美解决方案,分享给大家,具体如下: /** * deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符 * * 渠道标志为: * 1,andriod(a) * * 识别符来源标志: * 1, wifi mac地址(wifi): * 2, IMEI(imei): * 3, 序列号(sn): * 4, id:随机码.若前面的都取不到时,则随机生成一个随机码,需要缓存. * * @param context * @return */ p

  • 浅谈Android手机的抢红包插件

    前语 最近,Android手机上的手机管家更新了新版本,提供了红包闹钟功能,只要有微信红包或者QQ红包,就会自动提醒.恰逢最近又在做UI自动化的工作,使用到UI Automator框架.几行代码,就可以让手机自动完成某些操作,很有意思,今天就来扒一扒这背后的原理. UI Automator 传统的手工测试,我们需要点击一些控件元素,来查看输出的结果是否符合预期.比如在登录界面,输入正确的用户名和密码,点击登录按钮后,就可以正常登录. 如果这些操作,每一次都需要手工执行的话,是需要大量的人力成本的

  • 浅谈Android Activity与Service的交互方式

    实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上. 优缺点分析: 通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用.但缺点也十分明显,发送广播受到系统制约.系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟.同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应

  • 浅谈Android View绘制三大流程探索及常见问题

    View绘制的三大流程,指的是measure(测量).layout(布局).draw(绘制) measure负责确定View的测量宽/高,也就是该View需要占用屏幕的大小,确定完View需要占用的屏幕大小后,就会通过layout确定View的最终宽/高和四个顶点在手机界面上的位置,等通过measure和layout过程确定了View的宽高和要显示的位置后,就会执行draw绘制View的内容到手机屏幕上. 在详细介绍这三大流程之前,需要简单了解一下ViewRootImpl,View绘制的三大步骤

随机推荐