android缓存封装-没有最简只有更简
来源:互联网 发布:linux zip打包 TXT文件 编辑:程序博客网 时间:2024/06/07 10:02
为了使用方便,我将android内常用的缓存方式进行了封装:
(一)单独封装
(1)SharePreferences
这个东西最麻烦的是要传一个context,现封装为不需要context,不需要传mode,使用方式变为:
存:ShareUtils.resetShare("名称") .set("a","abc") .set("b",123) .set("c",true) .commit();
取:
boolean c = ShareUtils.resetShare("名称").getBoolean("c");
当然,你可以把getInstance改为静态,然后直接用resetShare,更为方便:
ShareUtils.resetShare(“名称”).getBoolean(“c”)
(2)Properties
这个其实java的,好处是不限定为应用存储区,可以放在sdcard,但是有些手机已经不支持它的非String类型,(原因不知道,测试结果是这样),这部分也重新封装了一下。
用法,存:
PropertiesUtil.resetProperties() .put("version",1) .put("dbVersion",2) .put("versionName",1.0) .put("isLatestVersion",true) .put("appName","CacheForAndroid") .save(saveFile);
取:
PropertiesUtil savedProperties = PropertiesUtil.resetProperties().loadProperties(saveFile);int version = savedProperties.getInt("version"); int dbVersion = savedProperties.getInt("dbVersion"); double versionName = savedProperties.getDouble("versionName"); boolean isLatestVersion = savedProperties.getBoolean("isLatestVersion"); ToastUtil.shorts("version="+version); ToastUtil.shorts("dbVersion="+dbVersion); ToastUtil.shorts("versionName="+versionName); ToastUtil.shorts("isLatestVersion="+isLatestVersion);
(3)序列化对象
存:
User user = getSaveUser();File saveFile = getSaveFile();SerialUtil.saveObjectInFile(user,saveFile);
取:
File saveFile = getSaveFile();User user = SerialUtil.restoreObjectByFile(saveFile,new User());showUserContent(user);
数据库用了greendao,因为很多时候没有主键,还是要用SQL语句写= =,不过作者已经封装的很好了,只有把获取dao的时候做个封装,大致如下:
public class DBManager { private static final String PWD = "123"; private static DaoSession encryptedSession; private static final String DB_NAME = "my.db"; public static DaoSession getSession(){ if(encryptedSession == null){ DBHelper dbHelper = new DBHelper(CacheForAndorid.getSuperContext(),DB_NAME,null); encryptedSession = new DaoMaster(dbHelper.getEncryptedWritableDb(PWD)).newSession(); } return encryptedSession; } private static DBUserDao userDao; public static DBUserDao getMyDBDao(){ if(userDao == null){ userDao = getSession().getDBUserDao(); } return userDao; } private static DBUserNoKeyDao noKeyDao; public static DBUserNoKeyDao getNoKeyDao(){ if(noKeyDao == null){ noKeyDao = getSession().getDBUserNoKeyDao(); } return noKeyDao; } private static CacheUserDao cacheUserDao; public static CacheUserDao getCacheUserDao(){ if(cacheUserDao == null){ cacheUserDao = getSession().getCacheUserDao(); } return cacheUserDao; }}
注意这里把session也封装了一层,因为无主键时删除和更新必须要写sql,大概是这样:
DBManager.getSession().getDatabase().execSQL(“delete from xx”);
如果不需要使用时可以删除掉。
(二)联合封装
我用了List+Share+数据库,因为使用了责任链,写的比较灵活,所以可以随意拆分,可扩展性也不错。
最外层,这样就可以保存到缓存了,
CacheUtil.setCacheUser(getMyCacheUser());
最外层,这样就可以从缓存取出了,
CacheUser cacheUser = CacheUtil.getCacheUser();
最主要的思想是链式传递,思路如下:
每种缓存封装为一个类,都实现如下接口:
public interface ICacheWay<T> { void setNextCache(ICacheWay<T> nextCache);//当取出的内容为空时,继续从下一级缓存中获取 void setCacheSaveTime(long overDueTime);//超时时间,超时下一次取回强制清空 T getCache(T t);//最重要的,获取缓存 void clearCacheOverDueTime(T t);//超时清空 void saveObjInCache(T t);//保存对象到缓存 void clearCache(T t);//无条件清除缓存中的t对象}
这样,在开始的时候都设定好下一级缓存以及超时时间,然后确定下一级:
如用集合缓存,设定时间为10*1000,下一级为SharePreferences:
ICacheWay<CacheUser> mListCache = new ListCache<>();ICacheWay<CacheUser> mShareCache = new ShareCache<>();mListCache.setNextCache(mShareCache);mListCache.setCacheSaveTime(10);CacheUser mCacheUser = mListCache.getCache(new CacheUser());
这样就可以完成二级缓存了,因为集合内获取不到时,自动从Share中再获取,如果从后面获取到结果,再保存到ListCache,这样就能达到联合的目的,是不是很灵活呢?快来用一用吧。
我的git:https://github.com/nfwuzhongdemeng/mutiCache
关于时间设定方面还不够完善,近段时间会继续更新。
- android缓存封装-没有最简只有更简
- 没有最忙,只有更忙
- 没有最兔子,只有更兔子
- 没有最郁闷只有更郁闷
- 生活是不是没有最糟,只有更糟!?!
- 没有最DT只有更DT,【NET类分享】
- 广州传智播客学.Net 没有最牛,只有更牛
- 营销时机:没有更好,只有更早
- 推荐——没有最水只有更水的OJ与史上最难OJ等世界OJ之最(IT)
- android清除缓存封装
- Android 只有年月没有日的datepickerdialog
- 数据库表设计,没有最好只有最适合
- Android中DisLruCache缓存封装
- Android DiskLruCache缓存工具封装
- Linux没有最小只有更小----迷你Linux版本大集合
- android Mediaplayer 播放视频 只有声音没有画面的问题
- android设备上视频只有声音没有图像
- Android设备标识-没有完美的解决方案-只有取舍
- Linux 字符类驱动使用rmmod卸载驱动出现问题
- QT编写和调用dll动态库最新版(隐式调用)
- failed to build Build Tools revision 22.0.1
- 一个前端去重问题
- 在Ubuntu16.04上安装Anaconda(3.6版本)和tensorflow模型
- android缓存封装-没有最简只有更简
- 删除github项目中已经存在的某个文件
- TypeError: Cannot convert Type TensorType(float32, matrix).....
- 03 rest-framework之请求和响应(request和response)
- 深度学习颠覆了对话人工智能
- bootstrap开发公众号后台,管理永久素材页面
- RuntimeError: module compiled against API version 0xa but this version of numpy is 0xb
- SpringBoot AutoConfiguration
- python socket.recv() 一直不停的返回空字符串,客户端怎么判断连接被断开?