Android中DisLruCache缓存封装

悠悠 2022-07-17 03:53 291阅读 0赞

Android中DisLruCache缓存封装

DisLruCache文件下载

CSDN下载

github下载

DisLruCache介绍

DisLruCache介绍(郭霖博客)

DisLruCache介绍(鸿洋博客)

DisLruCache之CacheManager封装

CacheManager是对DisLruCache的再次封装

  1. public class CacheManager {
  2. private static CacheManager manager;
  3. private DiskLruCache mDiskLruCache = null;
  4. private static final int CACHE_MAX_SIZE = 10 * 1024 * 1024;
  5. private static final int VALUE_COUNT = 1;
  6. private static Context context = APP.getContext();
  7. private static final int BUFFER = 1024;
  8. private CacheManager() {
  9. }
  10. public static CacheManager getInstance() {
  11. if (manager == null) {
  12. synchronized (CacheManager.class) {
  13. if (manager == null) {
  14. manager = new CacheManager();
  15. }
  16. }
  17. }
  18. return manager;
  19. }
  20. /** * 获取版本号 */
  21. public int getAppVersion() {
  22. try {
  23. PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
  24. return info.versionCode;
  25. } catch (PackageManager.NameNotFoundException e) {
  26. e.printStackTrace();
  27. }
  28. return 1;
  29. }
  30. /** * 获取缓存目录 */
  31. public File getDiskCacheDir(@NonNull String uniqueName) {
  32. String cachePath = "";
  33. if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
  34. || !Environment.isExternalStorageRemovable()) {
  35. File f = context.getExternalCacheDir();
  36. if (f != null) {
  37. cachePath = f.getPath();
  38. }
  39. } else {
  40. cachePath = context.getCacheDir().getPath();
  41. }
  42. Log.e("zhang", "getDiskCacheDir: " + cachePath);
  43. return new File(cachePath + File.separator + uniqueName);
  44. }
  45. /** * 一个缓存目录只有一个文件 */
  46. public CacheManager open(String dir) {
  47. open(dir, VALUE_COUNT);
  48. return manager;
  49. }
  50. /** * dir:缓存的目录/路径 * valueCount:缓存文件的个数 */
  51. public CacheManager open(String dir, int valueCount) {
  52. try {
  53. mDiskLruCache = DiskLruCache.open(getDiskCacheDir(dir), getAppVersion(), valueCount, CACHE_MAX_SIZE);
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. return manager;
  58. }
  59. /** * md5生成缓存key */
  60. public String hashKeyForDisk(@NonNull String key) {
  61. String cacheKey;
  62. try {
  63. final MessageDigest mDigest = MessageDigest.getInstance("MD5");
  64. mDigest.update(key.getBytes());
  65. cacheKey = bytesToHexString(mDigest.digest());
  66. } catch (NoSuchAlgorithmException e) {
  67. cacheKey = String.valueOf(key.hashCode());
  68. }
  69. return cacheKey;
  70. }
  71. private String bytesToHexString(byte[] bytes) {
  72. StringBuilder sb = new StringBuilder();
  73. for (byte aByte : bytes) {
  74. String hex = Integer.toHexString(0xFF & aByte);
  75. if (hex.length() == 1) {
  76. sb.append('0');
  77. }
  78. sb.append(hex);
  79. }
  80. return sb.toString();
  81. }
  82. /** * 保存字符串 * key是通过LinkedHashMap获取缓存中的Entry对象 * index是获取目录中的文件索引 * value是需要保存的信息值 */
  83. public void saveString(String key, int index, @NonNull String value) {
  84. try {
  85. DiskLruCache.Editor editor = mDiskLruCache.edit(hashKeyForDisk(key));
  86. editor.set(index, value);
  87. editor.commit();
  88. } catch (IOException e) {
  89. e.printStackTrace();
  90. }
  91. }
  92. public void saveString(String key, @NonNull String value) {
  93. saveString(key, 0, value);
  94. }
  95. /** * 保存流信息 * key是通过LinkedHashMap获取缓存中的Entry对象 * index是获取目录中的文件索引 * value是需要保存的信息流 */
  96. public void saveStream(String key, int index, @NonNull InputStream value) {
  97. int len = 0;
  98. byte[] bytes = new byte[BUFFER];
  99. OutputStream os = null;
  100. try {
  101. DiskLruCache.Editor editor = mDiskLruCache.edit(hashKeyForDisk(key));
  102. os = editor.newOutputStream(index);
  103. while ((len = value.read(bytes)) != -1) {
  104. os.write(bytes, 0, len);
  105. }
  106. editor.commit();
  107. mDiskLruCache.flush();
  108. } catch (IOException e) {
  109. e.printStackTrace();
  110. } finally {
  111. //快速关流
  112. DiskLruCache.closeQuietly(os);
  113. }
  114. }
  115. public void saveStream(@NonNull String key, @NonNull InputStream value) {
  116. saveStream(key, 0, value);
  117. }
  118. /** * 获取缓存的String字符串 * key是通过LinkedHashMap获取缓存中的Entry对象 * index是获取目录中的文件索引 */
  119. public String getString(@NonNull String key, int index) {
  120. try {
  121. DiskLruCache.Snapshot snapshot = mDiskLruCache.get(hashKeyForDisk(key));
  122. if (snapshot != null) {
  123. return snapshot.getString(index);
  124. }
  125. } catch (IOException e) {
  126. e.printStackTrace();
  127. }
  128. return "";
  129. }
  130. public String getString(@NonNull String key) {
  131. return getString(key, 0);
  132. }
  133. /** * 获取缓存的String字符串 * key是通过LinkedHashMap获取缓存中的Entry对象 * index是获取目录中的文件索引 */
  134. public InputStream getInputStream(@NonNull String key, int index) {
  135. try {
  136. DiskLruCache.Snapshot snapshot = mDiskLruCache.get(hashKeyForDisk(key));
  137. if (snapshot == null) return null;
  138. return snapshot.getInputStream(index);
  139. } catch (IOException e) {
  140. e.printStackTrace();
  141. }
  142. return null;
  143. }
  144. public InputStream getInputStream(@NonNull String key) {
  145. return getInputStream(key, 0);
  146. }
  147. /** * 删除对应的key缓存 */
  148. public boolean remove(@NonNull String key) {
  149. try {
  150. return mDiskLruCache.remove(hashKeyForDisk(key));
  151. } catch (IOException e) {
  152. e.printStackTrace();
  153. }
  154. return false;
  155. }
  156. /** * 清除所有信息 */
  157. public void clear() {
  158. try {
  159. mDiskLruCache.delete();
  160. } catch (IOException e) {
  161. e.printStackTrace();
  162. }
  163. }
  164. }

发表评论

表情:
评论列表 (有 0 条评论,291人围观)

还没有评论,来说两句吧...

相关阅读