请求网络数据是在安卓开发中使用最频繁的一个功能,网络请求的体验决定了用户对整个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(); } });
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍浅谈轻量级js模板引擎simplite,包括了浅谈轻量级js模板引擎simplite的使用技巧和注意事项,需要的朋友参考一下 模板地址:https://github.com/zhangshaolong/simplite欢迎各位提出宝贵意见及贡献代码。特点: 1:代码量少,学习成本低; 2:默认jsp语法标签方式,熟悉jsp的朋友可以直接按照jsp的语法书写模板; 3:使用原生js语法
问题内容: 题 我正在寻找Java内存对象缓存API。有什么建议吗?您过去使用过什么解决方案? 当前 现在,我只是在使用地图: 要求 我需要扩展缓存以包括以下基本功能: 最大尺寸 生存时间 但是,我不需要更复杂的功能,例如: 来自多个进程的访问(缓存服务器) 持久性(到磁盘) 意见建议 内存中缓存: Guava CacheBuilder-活动开发。请参阅此演示文稿。 LRUMap-通过API配置。
本文向大家介绍浅谈laravel框架与thinkPHP框架的区别,包括了浅谈laravel框架与thinkPHP框架的区别的使用技巧和注意事项,需要的朋友参考一下 主要区别:(thinkPHP更适合国人的编码习惯) 1、渲染模版方式的不同: 在Laravel框架里,使用return view()来渲染模版; 而ThinkPHP里则使用了$this->display()的方式渲染模版; 2、在Lar
本文向大家介绍浅谈JavaScript 框架分类,包括了浅谈JavaScript 框架分类的使用技巧和注意事项,需要的朋友参考一下 如果是从内部架构与理念划分,目前JavaScript框架可以划分为5类。 第1种 出现的是以命名空间为导向的类库或框架,如创建一个数组用new Array(),生成一个对象用new Object(),完全的Java风格,因此我们就可以以某一对象为根,不断为它添加对象属
本文向大家介绍浅谈Django的缓存机制,包括了浅谈Django的缓存机制的使用技巧和注意事项,需要的朋友参考一下 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之
问题内容: 是否有一个提供发布/订阅模式的Java轻量级框架? 一些理想的功能 支持泛型 向发布者注册多个订阅者 API主要是接口和一些有用的实现 完全不需要内存,持久性和事务保证。 我了解JMS,但这对我来说太过分了。发布/订阅的数据是文件系统扫描的结果,扫描结果被馈送到另一个组件进行处理,然后在将其馈给另一个组件之前进行处理,依此类推。 编辑:所有在同一过程中。bean的PropertyCha