赞
踩
用于实现存储设备缓存,即磁盘缓存,通过将缓存对象写入文件系统从而实现缓存的效果。
implementation "com.jakewharton:disklrucache:2.0.2"
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize) | |
directory | 存储路径,该文件夹里面所有文件参与计算大小。 |
appVersion | 应用的版本号,一般设为 1 即可。当版本号发生改变时会清空之前所有的缓存文件,而这个特性在实际开发中作用并不大,很多情况下即使应用的版本号发生了改变缓存文件却仍然是有效的。 |
valueCount | 表示同一个 key 可以对应多少个缓存文件,一般设为 1 即可。 |
maxSize | 表示缓存的总大小,比如 50MB,当缓存大小超出这个设定值后,DiskLruCache 会清除一些缓存从而保证总大小不大于这个设定值。 |
- /**
- * 外置路径:storage/emulated/0/Android/data/包名/cache
- * 内置路径:data/data/包名/ceche
- * @param cachePath 如果外置存储获取不到就从内置存储中获取,调用 context.externalCacheDir?.path ?: context.cacheDir.path
- */
- class BitmapDiskCache(
- private val cachePath: String
- ) {
- private val cacheSize = (1024 * 1024 * 50).toLong() //50M
- private val file = File(cachePath.plus("BitmapLru")).apply { if (!exists()) mkdirs() }
- private val instance = DiskLruCache.open(file, 1, 1, cacheSize)
-
- suspend fun write(key: String, value: Bitmap) = withContext(Dispatchers.IO) {
- val safeKey = toSafeKey(key)
- instance.use { cache ->
- //获取编辑器
- cache.edit(safeKey ).run {
- //获取输出流(0表示key对应的第一个缓存文件,不能超过创建时设置的valueCount)
- //实际使用时,根据写入的类型用需要的流再包装这个 OutputStream 后使用
- newOutputStream(0).use { outputStream ->
- //写入Bitmap
- value.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
- }
- //提交
- commit()
- }
- }
- }
-
- suspend fun read(key: String): Bitmap? = withContext(Dispatchers.IO) {
- val safeKey = toSafeKey(key)
- instance.use { cache ->
- //获取快照
- cache.get(safeKey ).run {
- //获取输入流(0表示key对应的第一个缓存文件,不能超过创建时设置的valueCount)
- //实际使用时,根据读取的类型用需要的流再包装这个 InputStream 后使用
- getInputStream(0).use { inputStream ->
- //读取Bitmap
- BitmapFactory.decodeStream(inputStream)
- }
- }
- }
- }
-
- suspend fun remove(key: String) = withContext(Dispatchers.IO) {
- instance.use { cache ->
- cache.remove(key)
- }
- }
-
- companion object {
- //MD5格式化成16进制的字符串,避免key有特殊字符串
- private fun toSafeKey(str: String): String {
- val byteArray = MessageDigest.getInstance("MD5").digest(str.toByteArray())
- return BigInteger(1, byteArray).toString(16)
- }
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。