摘要
安卓开发一般都需要进行数据缓存,常用操作老司机已为你封装完毕,经常有小伙伴问怎么判断缓存是否可用,那我告诉你,你可以用这份工具进行存储和查询,具体可以查看源码,现在为你开车,Demo传送门
安卓开发一般都需要进行数据缓存,常用操作老司机已为你封装完毕,经常有小伙伴问怎么判断缓存是否可用,那我告诉你,你可以用这份工具进行存储和查询,具体可以查看源码,现在为你开车,Demo传送门
安卓开发一般都需要进行数据缓存,常用操作老司机已为你封装完毕,经常有小伙伴问怎么判断缓存是否可用,那我告诉你,你可以用这份工具进行存储和查询,具体可以查看源码,现在为你开车,Demo传送门。
put : 保存String数据到缓存中
getAsString : 读取String数据
getAsJSONObject : 读取JSONObject数据
getAsJSONArray : 读取JSONArray数据
getAsBinary : 获取byte数据
getAsObject : 读取Serializable数据
getAsBitmap : 读取bitmap数据
getAsDrawable : 读取Drawable数据
file : 获取缓存文件
remove : 除某个key
clear : 清除所有数据
public class AppACache {
// 用法例子// ACache mCache = ACache.get(this); // 初始化,一般放在基类里// mCache.put("test_key1","test value");// mCache.put("test_key2", "test value", 10);// 保存10秒,如果超过10秒去获取这个key,将为null// mCache.put("test_key3", "test value", 2 ACache.TIME_DAY);// 保存两天,如果超过两天去获取这个key,将为null// String value = mCache.getAsString("test_key1");// 获取数据public static final int TIME_HOUR = 60 * 60;public static final int TIME_DAY = TIME_HOUR * 24;private static final int MAX_SIZE = 1000 * 1000 * 50; // 50 mbprivate static final int MAX_COUNT = Integer.MAX_VALUE; // 不限制存放数据的数量private static Map<String, AppACache> mInstanceMap = new HashMap<String, AppACache>();private ACacheManager mCache;public static AppACache get(Context ctx) { return get(ctx, "ACache");\n}public static AppACache get(Context ctx, String cacheName) {\n File f = new File(ctx.getCacheDir(), cacheName); return get(f, MAX_SIZE, MAX_COUNT);\n}public static AppACache get(File cacheDir) { return get(cacheDir, MAX_SIZE, MAX_COUNT);\n}public static AppACache get(Context ctx, long max_zise, int max_count) {\n File f = new File(ctx.getCacheDir(), "ACache"); return get(f, max_zise, max_count);\n}public static AppACache get(File cacheDir, long max_zise, int max_count) {\n AppACache manager = mInstanceMap.get(cacheDir.getAbsoluteFile() + myPid()); if (manager == null) {\n manager = new AppACache(cacheDir, max_zise, max_count);\n mInstanceMap.put(cacheDir.getAbsolutePath() + myPid(), manager);\n } return manager;\n}private static String myPid() { return "_" + android.os.Process.myPid();\n}private AppACache(File cacheDir, long max_size, int max_count) { if (!cacheDir.exists() && !cacheDir.mkdirs()) { throw new RuntimeException("can't make dirs in "\n + cacheDir.getAbsolutePath());\n }\n mCache = new ACacheManager(cacheDir, max_size, max_count);\n}/**\n * Provides a means to save a cached file before the data are available.\n * Since writing about the file is complete, and its close method is called,\n * its contents will be registered in the cache. Example of use:\n *\n * ACache cache = new ACache(this) try { OutputStream stream =\n * cache.put("myFileName") stream.write("some bytes".getBytes()); // now\n * update cache! stream.close(); } catch(FileNotFoundException e){\n * e.printStackTrace() }\n */class xFileOutputStream extends FileOutputStream {\n File file; public xFileOutputStream(File file) throws FileNotFoundException { super(file); this.file = file;\n } public void close() throws IOException { super.close();\n mCache.put(file);\n }\n}// =======================================// ============ String数据 读写 ==============// =======================================/**\n * 保存 String数据 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的String数据\n */public void put(String key, String value) {\n File file = mCache.newFile(key);\n BufferedWriter out = null; try {\n out = new BufferedWriter(new FileWriter(file), 1024);\n out.write(value);\n } catch (IOException e) {\n e.printStackTrace();\n } finally { if (out != null) { try {\n out.flush();\n out.close();\n } catch (IOException e) {\n e.printStackTrace();\n }\n }\n mCache.put(file);\n }\n}/**\n * 保存 String数据 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的String数据\n * @param saveTime\n * 保存的时间,单位:秒\n */public void put(String key, String value, int saveTime) {\n put(key, Utils.newStringWithDateInfo(saveTime, value));\n}/**\n * 读取 String数据\n * \n * @param key\n * @return String 数据\n */public String getAsString(String key) {\n File file = mCache.get(key); if (!file.exists()) return null; boolean removeFile = false;\n BufferedReader in = null; try {\n in = new BufferedReader(new FileReader(file));\n String readString = "";\n String currentLine; while ((currentLine = in.readLine()) != null) {\n readString += currentLine;\n } if (!Utils.isDue(readString)) { return Utils.clearDateInfo(readString);\n } else {\n removeFile = true; return null;\n }\n } catch (IOException e) {\n e.printStackTrace(); return null;\n } finally { if (in != null) { try {\n in.close();\n } catch (IOException e) {\n e.printStackTrace();\n }\n } if (removeFile)\n remove(key);\n }\n}// =======================================// ============= JSONObject 数据 读写 ==============// =======================================/**\n * 保存 JSONObject数据 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的JSON数据\n */public void put(String key, JSONObject value) {\n put(key, value.toString());\n}/**\n * 保存 JSONObject数据 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的JSONObject数据\n * @param saveTime\n * 保存的时间,单位:秒\n */public void put(String key, JSONObject value, int saveTime) {\n put(key, value.toString(), saveTime);\n}/**\n * 读取JSONObject数据\n * \n * @param key\n * @return JSONObject数据\n */public JSONObject getAsJSONObject(String key) {\n String JSONString = getAsString(key); try {\n JSONObject obj = new JSONObject(JSONString); return obj;\n } catch (Exception e) {\n e.printStackTrace(); return null;\n }\n}// =======================================// ============ JSONArray 数据 读写 =============// =======================================/**\n * 保存 JSONArray数据 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的JSONArray数据\n */public void put(String key, JSONArray value) {\n put(key, value.toString());\n}/**\n * 保存 JSONArray数据 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的JSONArray数据\n * @param saveTime\n * 保存的时间,单位:秒\n */public void put(String key, JSONArray value, int saveTime) {\n put(key, value.toString(), saveTime);\n}/**\n * 读取JSONArray数据\n * \n * @param key\n * @return JSONArray数据\n */public JSONArray getAsJSONArray(String key) {\n String JSONString = getAsString(key); try {\n JSONArray obj = new JSONArray(JSONString); return obj;\n } catch (Exception e) {\n e.printStackTrace(); return null;\n }\n}// =======================================// ============== byte 数据 读写 =============// =======================================/**\n * 保存 byte数据 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的数据\n */public void put(String key, byte[] value) {\n File file = mCache.newFile(key);\n FileOutputStream out = null; try {\n out = new FileOutputStream(file);\n out.write(value);\n } catch (Exception e) {\n e.printStackTrace();\n } finally { if (out != null) { try {\n out.flush();\n out.close();\n } catch (IOException e) {\n e.printStackTrace();\n }\n }\n mCache.put(file);\n }\n}/**\n * Cache for a stream\n *\n * @param key\n * the file name.\n * @return OutputStream stream for writing data.\n * @throws FileNotFoundException\n * if the file can not be created.\n */public OutputStream put(String key) throws FileNotFoundException { return new xFileOutputStream(mCache.newFile(key));\n}/**\n *\n * @param key\n * the file name.\n * @return (InputStream or null) stream previously saved in cache.\n * @throws FileNotFoundException\n * if the file can not be opened\n */public InputStream get(String key) throws FileNotFoundException {\n File file = mCache.get(key); if (!file.exists()) return null; return new FileInputStream(file);\n}/**\n * 保存 byte数据 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的数据\n * @param saveTime\n * 保存的时间,单位:秒\n */public void put(String key, byte[] value, int saveTime) {\n put(key, Utils.newByteArrayWithDateInfo(saveTime, value));\n}/**\n * 获取 byte 数据\n * \n * @param key\n * @return byte 数据\n */public byte[] getAsBinary(String key) {\n RandomAccessFile RAFile = null; boolean removeFile = false; try {\n File file = mCache.get(key); if (!file.exists()) return null;\n RAFile = new RandomAccessFile(file, "r"); byte[] byteArray = new byte[(int) RAFile.length()];\n RAFile.read(byteArray); if (!Utils.isDue(byteArray)) { return Utils.clearDateInfo(byteArray);\n } else {\n removeFile = true; return null;\n }\n } catch (Exception e) {\n e.printStackTrace(); return null;\n } finally { if (RAFile != null) { try {\n RAFile.close();\n } catch (IOException e) {\n e.printStackTrace();\n }\n } if (removeFile)\n remove(key);\n }\n}// =======================================// ============= 序列化 数据 读写 ===============// =======================================/**\n * 保存 Serializable数据 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的value\n */public void put(String key, Serializable value) {\n put(key, value, -1);\n}/**\n * 保存 Serializable数据到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的value\n * @param saveTime\n * 保存的时间,单位:秒\n */public void put(String key, Serializable value, int saveTime) {\n ByteArrayOutputStream baos = null;\n ObjectOutputStream oos = null; try {\n baos = new ByteArrayOutputStream();\n oos = new ObjectOutputStream(baos);\n oos.writeObject(value); byte[] data = baos.toByteArray(); if (saveTime != -1) {\n put(key, data, saveTime);\n } else {\n put(key, data);\n }\n } catch (Exception e) {\n e.printStackTrace();\n } finally { try {\n oos.close();\n } catch (IOException e) {\n }\n }\n}/**\n * 读取 Serializable数据\n * \n * @param key\n * @return Serializable 数据\n */public Object getAsObject(String key) { byte[] data = getAsBinary(key); if (data != null) {\n ByteArrayInputStream bais = null;\n ObjectInputStream ois = null; try {\n bais = new ByteArrayInputStream(data);\n ois = new ObjectInputStream(bais);\n Object reObject = ois.readObject(); return reObject;\n } catch (Exception e) {\n e.printStackTrace(); return null;\n } finally { try { if (bais != null)\n bais.close();\n } catch (IOException e) {\n e.printStackTrace();\n } try { if (ois != null)\n ois.close();\n } catch (IOException e) {\n e.printStackTrace();\n }\n }\n } return null;\n\n}// =======================================// ============== bitmap 数据 读写 =============// =======================================/**\n * 保存 bitmap 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的bitmap数据\n */public void put(String key, Bitmap value) {\n put(key, Utils.Bitmap2Bytes(value));\n}/**\n * 保存 bitmap 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的 bitmap 数据\n * @param saveTime\n * 保存的时间,单位:秒\n */public void put(String key, Bitmap value, int saveTime) {\n put(key, Utils.Bitmap2Bytes(value), saveTime);\n}/**\n * 读取 bitmap 数据\n * \n * @param key\n * @return bitmap 数据\n */public Bitmap getAsBitmap(String key) { if (getAsBinary(key) == null) { return null;\n } return Utils.Bytes2Bimap(getAsBinary(key));\n}// =======================================// ============= drawable 数据 读写 =============// =======================================/**\n * 保存 drawable 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的drawable数据\n */public void put(String key, Drawable value) {\n put(key, Utils.drawable2Bitmap(value));\n}/**\n * 保存 drawable 到 缓存中\n * \n * @param key\n * 保存的key\n * @param value\n * 保存的 drawable 数据\n * @param saveTime\n * 保存的时间,单位:秒\n */public void put(String key, Drawable value, int saveTime) {\n put(key, Utils.drawable2Bitmap(value), saveTime);\n}/**\n * 读取 Drawable 数据\n * \n * @param key\n * @return Drawable 数据\n */public Drawable getAsDrawable(String key) { if (getAsBinary(key) == null) { return null;\n } return Utils.bitmap2Drawable(Utils.Bytes2Bimap(getAsBinary(key)));\n}/**\n * 获取缓存文件\n * \n * @param key\n * @return value 缓存的文件\n */public File file(String key) {\n File f = mCache.newFile(key); if (f.exists()) return f; return null;\n}/**\n * 移除某个key\n * \n * @param key\n * @return 是否移除成功\n */public boolean remove(String key) { return mCache.remove(key);\n}/**\n * 清除所有数据\n */public void clear() {\n mCache.clear();\n}/**\n * @title 缓存管理器\n * @version 1.0\n */public class ACacheManager { private final AtomicLong cacheSize; private final AtomicInteger cacheCount; private final long sizeLimit; private final int countLimit; private final Map<File, Long> lastUsageDates = Collections\n .synchronizedMap(new HashMap<File, Long>()); protected File cacheDir; private ACacheManager(File cacheDir, long sizeLimit, int countLimit) { this.cacheDir = cacheDir; this.sizeLimit = sizeLimit; this.countLimit = countLimit;\n cacheSize = new AtomicLong();\n cacheCount = new AtomicInteger();\n calculateCacheSizeAndCacheCount();\n } /**\n * 计算 cacheSize和cacheCount\n */\n private void calculateCacheSizeAndCacheCount() { new Thread(new Runnable() { @Override\n public void run() { int size = 0; int count = 0;\n File[] cachedFiles = cacheDir.listFiles(); if (cachedFiles != null) { for (File cachedFile : cachedFiles) {\n size += calculateSize(cachedFile);\n count += 1;\n lastUsageDates.put(cachedFile,\n cachedFile.lastModified());\n }\n cacheSize.set(size);\n cacheCount.set(count);\n }\n }\n }).start();\n } private void put(File file) { int curCacheCount = cacheCount.get(); while (curCacheCount + 1 > countLimit) { long freedSize = removeNext();\n cacheSize.addAndGet(-freedSize);\n\n curCacheCount = cacheCount.addAndGet(-1);\n }\n cacheCount.addAndGet(1); long valueSize = calculateSize(file); long curCacheSize = cacheSize.get(); while (curCacheSize + valueSize > sizeLimit) { long freedSize = removeNext();\n curCacheSize = cacheSize.addAndGet(-freedSize);\n }\n cacheSize.addAndGet(valueSize);\n\n Long currentTime = System.currentTimeMillis();\n file.setLastModified(currentTime);\n lastUsageDates.put(file, currentTime);\n } private File get(String key) {\n File file = newFile(key);\n Long currentTime = System.currentTimeMillis();\n file.setLastModified(currentTime);\n lastUsageDates.put(file, currentTime); return file;\n } private File newFile(String key) { return new File(cacheDir, key.hashCode() + "");\n } private boolean remove(String key) {\n File image = get(key); return image.delete();\n } private void clear() {\n lastUsageDates.clear();\n cacheSize.set(0);\n File[] files = cacheDir.listFiles(); if (files != null) { for (File f : files) {\n f.delete();\n }\n }\n } /*\n * Drawable → Bitmap\n */\n private static Bitmap drawable2Bitmap(Drawable drawable) { if (drawable == null) { return null;\n } // 取 drawable 的长宽\n int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); // 取 drawable 的颜色格式\n Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888\n : Bitmap.Config.RGB_565; // 建立对应 bitmap\n Bitmap bitmap = Bitmap.createBitmap(w, h, config); // 建立对应 bitmap 的画布\n Canvas canvas = new Canvas(bitmap);\n drawable.setBounds(0, 0, w, h); // 把 drawable 内容画到画布中\n drawable.draw(canvas); return bitmap;\n } /*\n * Bitmap → Drawable\n */\n @SuppressWarnings("deprecation") private static Drawable bitmap2Drawable(Bitmap bm) { if (bm == null) { return null;\n } return new BitmapDrawable(bm);\n }\n}
}
好了,终点站到了,如果对本次旅途满意的话,请给五星好评哦,没关注的小伙伴轻轻点个上方的关注,毕竟老司机牺牲了很多时间才换来这么一份工具类,如果该工具类依赖其他工具类,都可以在我的史上最全的常用开发工具类收集(持续更新中)中找到。