• Android 优化 - 磁盘缓存DiskLruCache


    一、概念

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

    二、使用

    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 put(key: String, value: Bitmap) = withContext(Dispatchers.IO) {
    13. instance.use { cache ->
    14. //获取编辑器
    15. cache.edit(key).run {
    16. //获取输出流(0表示第一个缓存文件,不能超过创建时设置的valueCount)
    17. newOutputStream(0).use { outputStream ->
    18. //写入Bitmap
    19. value.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
    20. }
    21. //提交
    22. commit()
    23. }
    24. }
    25. }
    26. suspend fun get(key: String): Bitmap? = withContext(Dispatchers.IO) {
    27. instance.use { cache ->
    28. //获取快照
    29. cache.get(key).run {
    30. //获取输入流(0表示第一个缓存文件,不能超过创建时设置的valueCount)
    31. getInputStream(0).use { inputStream ->
    32. //读取Bitmap
    33. BitmapFactory.decodeStream(inputStream)
    34. }
    35. }
    36. }
    37. }
    38. suspend fun remove(key: String) = withContext(Dispatchers.IO) {
    39. instance.use { cache ->
    40. cache.remove(key)
    41. }
    42. }
    43. }

  • 相关阅读:
    【无标题】
    Chapter5: SpringBoot与Web开发2
    React和Redux中的不变性
    Spring Beans 官方文档翻译笔记
    jmeter做性能测试
    学生HTML个人网页作业作品 使用HTML+CSS+JavaScript个人介绍博客网站 web前端课程设计 web前端课程设计代码 web课程设计
    高通量测序的数据处理与分析指北(二)-宏基因组篇
    第七章:最新版零基础学习 PYTHON 教程—Python 列表(第一节 -Python 列表及示例)
    android room数据库升级脚本常见问题
    【译】.NET 7 中的性能改进(三)
  • 原文地址:https://blog.csdn.net/HugMua/article/details/133915222