浅谈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进行高级初始化:
newRxCache.Builder() .setDebug(true)//开启debug,开启后会打印缓存相关日志,默认为true .setConverter(newGsonConverter())//设置转换方式,默认为Gson转换 .setCacheMode(CacheMode.BOTH)//设置缓存模式,默认为二级缓存 .setMemoryCacheSizeByMB(50)//设置内存缓存的大小,单位是MB .setDiskCacheSizeByMB(100)//设置磁盘缓存的大小,单位是MB .setDiskDirName("RxCache")//设置磁盘缓存的文件夹名称 .build();
写入缓存
RxCache.getInstance() .put("test","Thisisdatatocache.",10*1000)//key:缓存的keydata:具体的数据time:缓存的有效时间 .compose(RxUtil.io_main())//线程调度 .subscribe(newConsumer (){ @Override publicvoidaccept(BooleanaBoolean)throwsException{ if(aBoolean)Log.d("Cache","cachesuccessful!"); } },newConsumer (){ @Override publicvoidaccept(Throwablethrowable)throwsException{ throwable.printStackTrace(); } });
读取缓存
读取缓存时,分为以下几种情况:
若为Gson转换时:
读取基本类型数据,或自定义的javabean数据,或数组数据等一切可以获取.class的数据
RxCache.getInstance() .get("test",false,String.class)//key:缓存的keyupdate:表示从缓存获取数据强行返回NULL .compose(RxUtil.>io_main()) .subscribe(newConsumer >(){ @Override publicvoidaccept(CacheResponse stringCacheResponse)throwsException{ if(stringCacheResponse.getData()!=null) Log.d("datafromcache:"+stringCacheResponse.getData()); } },newConsumer (){ @Override publicvoidaccept(Throwablethrowable)throwsException{ throwable.printStackTrace(); } });
读取List等无法获取.class的数据,以上基本数据也可以使用此方式
Typetype=newTypeToken>(){}.getType(); RxCache.getInstance() .
>get("test",false,type)//由于Type不是类,需要指定泛型 .compose(RxUtil.
>>io_main()) .subscribe(newConsumer >>(){ @Override publicvoidaccept(CacheResponse >listCacheResponse)throwsException{ if(listCacheResponse.getData()!=null) Log.d("datafromcache:"+listCacheResponse.getData().toString()); } },newConsumer
(){ @Override publicvoidaccept(Throwablethrowable)throwsException{ throwable.printStackTrace(); } });
若为Serialize方式时,则统一使用以下方法即可:
RxCache.getInstance() .>get("test",false)//指定泛型,不再需要传.class或Type .compose(RxUtil.
>>io_main()) .subscribe(newConsumer >>(){ @Override publicvoidaccept(CacheResponse >listCacheResponse)throwsException{ if(listCacheResponse.getData()!=null) Log.d("datafromcache:"+listCacheResponse.getData().toString()); } },newConsumer
(){ @Override publicvoidaccept(Throwablethrowable)throwsException{ throwable.printStackTrace(); } });
清除指定缓存
RxCache.getInstance() .remove("testList") .compose(RxUtil.io_main()) .subscribe(newConsumer (){ @Override publicvoidaccept(BooleanaBoolean)throwsException{ if(aBoolean)Log.d("cachedatahasbeendeleted."); } },newConsumer (){ @Override publicvoidaccept(Throwablethrowable)throwsException{ throwable.printStackTrace(); } });
清除全部缓存
RxCache.getInstance() .clear() .compose(RxUtil.io_main()) .subscribe(newConsumer (){ @Override publicvoidaccept(BooleanaBoolean)throwsException{ if(aBoolean)Log.d("Alldatashasbeendeleted."); } },newConsumer (){ @Override publicvoidaccept(Throwablethrowable)throwsException{ throwable.printStackTrace(); } });
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。