ACache轻量级缓存框架
来源:互联网 发布:毒药法术升级数据 编辑:程序博客网 时间:2024/05/18 00:46
前言:关于该框架的评价,个人感觉还是可以的,可以保存多种类型的对象,主要特点是可以缓存bitmap、JSONObject、byte等对象,这方面比android原生的SharePreferences有优势,但对于boolean类型的数据处理好像不是很好,反正根据项目具体情况合理使用即可。
官方介绍
1、它可以缓存什么东西?
普通的字符串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java对象,和 byte数据。
2、它有什么特色?
特色主要是:
1)轻,轻到只有一个JAVA文件。
2)可配置,可以配置缓存路径,缓存大小,缓存数量等。
3)可以设置缓存超时时间,缓存超时自动失效,并被删除。
4)支持多进程。
3、它在android中可以用在哪些场景?
1)替换SharePreference当做配置文件
2)可以缓存网络请求数据,比如oschina的android客户端可以缓存http请求的新闻内容,缓存时间假设为1个小时,超时后自动失效,让客户端重新请求新的数据,减少客户端流量,同时减少服务器并发量。
使用:
//初始化ACache mCache = ACache.get(this);//保存数据,文件名为testStringmCache.put("testString", "1111");//读取数据String testString = mCache.getAsString("testString");//清空数据mCache.remove("testString");
ACache框架(或称工具类,其实就是对特定的对象进行流的处理和转化而已)
/** * 移除旧的文件 * * @return */ private long removeNext() { if (lastUsageDates.isEmpty()) { return 0; } Long oldestUsage = null; File mostLongUsedFile = null; Set<Entry<File, Long>> entries = lastUsageDates.entrySet(); synchronized (lastUsageDates) { for (Entry<File, Long> entry : entries) { if (mostLongUsedFile == null) { mostLongUsedFile = entry.getKey(); oldestUsage = entry.getValue(); } else { Long lastValueUsage = entry.getValue(); if (lastValueUsage < oldestUsage) { oldestUsage = lastValueUsage; mostLongUsedFile = entry.getKey(); } } } } long fileSize = calculateSize(mostLongUsedFile); if (mostLongUsedFile.delete()) { lastUsageDates.remove(mostLongUsedFile); } return fileSize; } private long calculateSize(File file) { return file.length(); } } /** * @title 时间计算工具类 * @author 杨福海(michael) www.yangfuhai.com * @version 1.0 */ private static class Utils { /** * 判断缓存的String数据是否到期 * * @param str * @return true:到期了 false:还没有到期 */ private static boolean isDue(String str) { return isDue(str.getBytes()); } /** * 判断缓存的byte数据是否到期 * * @param data * @return true:到期了 false:还没有到期 */ private static boolean isDue(byte[] data) { String[] strs = getDateInfoFromDate(data); if (strs != null && strs.length == 2) { String saveTimeStr = strs[0]; while (saveTimeStr.startsWith("0")) { saveTimeStr = saveTimeStr .substring(1, saveTimeStr.length()); } long saveTime = Long.valueOf(saveTimeStr); long deleteAfter = Long.valueOf(strs[1]); if (System.currentTimeMillis() > saveTime + deleteAfter * 1000) { return true; } } return false; } private static String newStringWithDateInfo(int second, String strInfo) { return createDateInfo(second) + strInfo; } private static byte[] newByteArrayWithDateInfo(int second, byte[] data2) { byte[] data1 = createDateInfo(second).getBytes(); byte[] retdata = new byte[data1.length + data2.length]; System.arraycopy(data1, 0, retdata, 0, data1.length); System.arraycopy(data2, 0, retdata, data1.length, data2.length); return retdata; } private static String clearDateInfo(String strInfo) { if (strInfo != null && hasDateInfo(strInfo.getBytes())) { strInfo = strInfo.substring(strInfo.indexOf(mSeparator) + 1, strInfo.length()); } return strInfo; } private static byte[] clearDateInfo(byte[] data) { if (hasDateInfo(data)) { return copyOfRange(data, indexOf(data, mSeparator) + 1, data.length); } return data; } private static boolean hasDateInfo(byte[] data) { return data != null && data.length > 15 && data[13] == '-' && indexOf(data, mSeparator) > 14; } private static String[] getDateInfoFromDate(byte[] data) { if (hasDateInfo(data)) { String saveDate = new String(copyOfRange(data, 0, 13)); String deleteAfter = new String(copyOfRange(data, 14, indexOf(data, mSeparator))); return new String[] { saveDate, deleteAfter }; } return null; } private static int indexOf(byte[] data, char c) { for (int i = 0; i < data.length; i++) { if (data[i] == c) { return i; } } return -1; } private static byte[] copyOfRange(byte[] original, int from, int to) { int newLength = to - from; if (newLength < 0) throw new IllegalArgumentException(from + " > " + to); byte[] copy = new byte[newLength]; System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength)); return copy; } private static final char mSeparator = ' '; private static String createDateInfo(int second) { String currentTime = System.currentTimeMillis() + ""; while (currentTime.length() < 13) { currentTime = "0" + currentTime; } return currentTime + "-" + second + mSeparator; } /* * Bitmap → byte[] */ private static byte[] Bitmap2Bytes(Bitmap bm) { if (bm == null) { return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } /* * byte[] → Bitmap */ private static Bitmap Bytes2Bimap(byte[] b) { if (b.length == 0) { return null; } return BitmapFactory.decodeByteArray(b, 0, b.length); } /* * Drawable → Bitmap */ private static Bitmap drawable2Bitmap(Drawable drawable) { if (drawable == null) { return null; } // 取 drawable 的长宽 int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); // 取 drawable 的颜色格式 Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; // 建立对应 bitmap Bitmap bitmap = Bitmap.createBitmap(w, h, config); // 建立对应 bitmap 的画布 Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, w, h); // 把 drawable 内容画到画布中 drawable.draw(canvas); return bitmap; } /* * Bitmap → Drawable */ @SuppressWarnings("deprecation") private static Drawable bitmap2Drawable(Bitmap bm) { if (bm == null) { return null; } return new BitmapDrawable(bm); } }}
以上就是全部内容,大家可以自个去试试,喜欢的朋友可以加个关注,以后有好的文章可以及时查阅讨论,有什么问题也可以留言,或者在微信公众号“技术帮团队”上找我们。
0 0
- ACache轻量级缓存框架
- android轻量级缓存框架ACache
- ACache-缓存-一个轻量级框架
- 推荐一个轻量级缓存框架——ACache(ASimpleCache)
- Android缓存框架:ACache
- ACache缓存框架
- 开源框架——轻量级缓存框架——ACache(ASimpleCache)
- android轻量级开源缓存框架——ASimpleCache(ACache)源码分析
- Android轻量级开源缓存框架——ASimpleCache(ACache)源码分析
- android轻量级开源缓存框架——ASimpleCache(ACache)源码分析
- android轻量级开源缓存框架——ASimpleCache(ACache)源码分析
- android轻量级开源缓存框架——ASimpleCache(ACache)源码分析
- android轻量级开源缓存框架——ASimpleCache(ACache)源码分析
- android轻量级开源缓存框架——ASimpleCache(ACache)源码分析
- ASimpleCache (ACache)缓存框架
- 【Android开源项目分析】android轻量级开源缓存框架——ASimpleCache(ACache)源码分析
- 【Android开源项目分析】android轻量级开源缓存框架——ASimpleCache(ACache)源码分析
- 【Android开源项目分析】android轻量级开源缓存框架——ASimpleCache(ACache)源码分析
- 15、KVC、KVO和谓词
- UITextField和UITextView限制字数
- C++ Oracle OCCI 编程
- Filter高级开发(二)——实现敏感字符过滤功能
- arcgis总结——地理信息服务的发布以及通过rest服务进行geocode相关操作
- ACache轻量级缓存框架
- 三列布局中间列宽度自适应
- windows 配置 git
- JavaScript操作cookie与localStorage
- 人件读书笔记(29)自我愈复系统
- libsvm交叉验证与网格搜索(参数选择)
- windows安装go-sqlite3失败,提示找不到gcc
- MySQL 5.7及以上解压缩版本配置安装
- postgresql9.5 安装配置和使用(on centos7)