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

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

时间: 2024-08-01 21:03:24

浅谈Android轻量级的数据缓存框架RxCache的相关文章

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

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

浅谈Android开发中项目的文件结构及规范化部署建议_java

一.几句话 使用Gradle及其推荐的项目框架 把密码等敏感数据放入gradle.properties 不要自己写Http客户端,使用Volley或OkHttp库 使用Jackson库来解析JSON数据 避免Guava并出于Dalvik 65K methods limit不要使用过多的库 使用Fragment来绘制UI界面 Activity主要用来管理Fragment 布局文件XML也是代码,好好组织它们 在布局文件里,使用styles以避免重复的属性 使用多个style文件而不是一个巨大的st

浅谈Android应用保护(一):Android应用逆向的基本方法

对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇文章主要介绍一些基本的应用逆向和分析方法,演示Android应用的代码机密性和完整性是如何被破坏,进而被应用攻击者所用的. 一.Dalvik层源码逆向 在dalvik层代码的分析中,(一般情况下,对于未进行防护的应用)在Dalvik层,我们只关心classes.dex的逆向分析. classes.d

浅谈Ajax请求与浏览器缓存_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应用保护(零):出发点和背景             近几年来,无线平台特别是Android平台的安全逐渐成为各厂商关注的重点.各种新的思路和玩法层出不穷.所以,笔者基于前一段时间的学习和整理,写了这系列关于Android应用安全和保护的文章. 这5篇文章主要关注客户端代码和数据的保护,介绍了几种针对Android应用的逆向分析.攻击和防护的方法.内容比较浅显,适合没有Android安全研究背景的同学入门和科普阅读. 无线端应用对抗的出发点和背景 根本上来说,手机客户端是完全控

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

实现更新下载进度的功能 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绘制的三大步骤

浅谈Android Activity与Service的交互方式

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