当前位置:   article > 正文

Android 优化 - 磁盘缓存 DiskLruCache_android disklrucache缓存byte数组

android disklrucache缓存byte数组

一、概念

用于实现存储设备缓存,即磁盘缓存,通过将缓存对象写入文件系统从而实现缓存的效果。

二、使用

2.1 添加依赖

最新依赖

implementation "com.jakewharton:disklrucache:2.0.2"

2.2 配置权限

  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.3 创建对象 open()

public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)
directory

存储路径,该文件夹里面所有文件参与计算大小。

appVersion应用的版本号,一般设为 1 即可。当版本号发生改变时会清空之前所有的缓存文件,而这个特性在实际开发中作用并不大,很多情况下即使应用的版本号发生了改变缓存文件却仍然是有效的。
valueCount表示同一个 key 可以对应多少个缓存文件,一般设为 1 即可。
maxSize表示缓存的总大小,比如 50MB,当缓存大小超出这个设定值后,DiskLruCache 会清除一些缓存从而保证总大小不大于这个设定值。
  • 缓存的key为String类型,且必须匹配正则表达式[a-z0-9_-]{1,64}。
  •  一个key可以对应多个value,value类型为字节数组,大小在0 ~ Integer.MAX_VALUE之间
  • 缓存的目录必须为专用目录,因为DiskLruCache可能会删除或覆盖该目录下的文件。
  • 添加缓存操作具备原子性,但多个进程不应该同时使用同一个缓存目录。 
  1. /**
  2. * 外置路径:storage/emulated/0/Android/data/包名/cache
  3. * 内置路径:data/data/包名/ceche
  4. * @param cachePath 如果外置存储获取不到就从内置存储中获取,调用 context.externalCacheDir?.path ?: context.cacheDir.path
  5. */
  6. class BitmapDiskCache(
  7. private val cachePath: String
  8. ) {
  9. private val cacheSize = (1024 * 1024 * 50).toLong() //50M
  10. private val file = File(cachePath.plus("BitmapLru")).apply { if (!exists()) mkdirs() }
  11. private val instance = DiskLruCache.open(file, 1, 1, cacheSize)
  12. suspend fun write(key: String, value: Bitmap) = withContext(Dispatchers.IO) {
  13. val safeKey = toSafeKey(key)
  14. instance.use { cache ->
  15. //获取编辑器
  16. cache.edit(safeKey ).run {
  17. //获取输出流(0表示key对应的第一个缓存文件,不能超过创建时设置的valueCount)
  18. //实际使用时,根据写入的类型用需要的流再包装这个 OutputStream 后使用
  19. newOutputStream(0).use { outputStream ->
  20. //写入Bitmap
  21. value.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
  22. }
  23. //提交
  24. commit()
  25. }
  26. }
  27. }
  28. suspend fun read(key: String): Bitmap? = withContext(Dispatchers.IO) {
  29. val safeKey = toSafeKey(key)
  30. instance.use { cache ->
  31. //获取快照
  32. cache.get(safeKey ).run {
  33. //获取输入流(0表示key对应的第一个缓存文件,不能超过创建时设置的valueCount)
  34. //实际使用时,根据读取的类型用需要的流再包装这个 InputStream 后使用
  35. getInputStream(0).use { inputStream ->
  36. //读取Bitmap
  37. BitmapFactory.decodeStream(inputStream)
  38. }
  39. }
  40. }
  41. }
  42. suspend fun remove(key: String) = withContext(Dispatchers.IO) {
  43. instance.use { cache ->
  44. cache.remove(key)
  45. }
  46. }
  47. companion object {
  48. //MD5格式化成16进制的字符串,避免key有特殊字符串
  49. private fun toSafeKey(str: String): String {
  50. val byteArray = MessageDigest.getInstance("MD5").digest(str.toByteArray())
  51. return BigInteger(1, byteArray).toString(16)
  52. }
  53. }
  54. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号