From ed29ccc7b0697984aca744a6e098d325f129333c Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Wed, 1 Jun 2022 14:06:56 +0800 Subject: [PATCH] chore(book/read): BitmapLruCache store key change to filePath --- .../app/ui/book/read/ReadBookViewModel.kt | 5 +++-- .../book/read/page/provider/ImageProvider.kt | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 4f2094184..339df6767 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -394,9 +394,10 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { fun refreshImage(src: String) { execute { - ImageProvider.bitmapLruCache.remove(src) ReadBook.book?.let { book -> - BookHelp.getImage(book, src).delete() + val vFile = BookHelp.getImage(book, src) + ImageProvider.bitmapLruCache.remove(vFile.absolutePath) + vFile.delete() } }.onFinally { ReadBook.loadContent(false) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt index f485ab7be..549372c51 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt @@ -28,26 +28,27 @@ object ImageProvider { } /** - *缓存bitmap LruCache实现 + * 缓存bitmap LruCache实现 + * filePath bitmap */ private const val M = 1024 * 1024 val cacheSize get() = AppConfig.bitmapCacheSize * M val bitmapLruCache = object : LruCache(cacheSize) { - override fun sizeOf(key: String, bitmap: Bitmap): Int { + override fun sizeOf(filePath: String, bitmap: Bitmap): Int { return bitmap.byteCount } override fun entryRemoved( evicted: Boolean, - key: String, + filePath: String, oldBitmap: Bitmap, newBitmap: Bitmap? ) { //错误图片不能释放,占位用,防止一直重复获取图片 if (oldBitmap != errorBitmap) { oldBitmap.recycle() - putDebug("ImageProvider: trigger bitmap recycle. URI: $key") + putDebug("ImageProvider: trigger bitmap recycle. URI: $filePath") putDebug("ImageProvider : cacheUsage ${size()}bytes / ${maxSize()}bytes") } } @@ -112,19 +113,21 @@ object ImageProvider { width: Int, height: Int? = null ): Bitmap { - val cacheBitmap = bitmapLruCache.get(src) - if (cacheBitmap != null) return cacheBitmap val vFile = BookHelp.getImage(book, src) if (!vFile.exists()) return errorBitmap + //epub文件提供图片链接是相对链接,同时阅读多个epub文件,缓存命中错误 + //bitmapLruCache的key同一改成缓存文件的路径 + val cacheBitmap = bitmapLruCache.get(vFile.absolutePath) + if (cacheBitmap != null) return cacheBitmap @Suppress("BlockingMethodInNonBlockingContext") return kotlin.runCatching { val bitmap = BitmapUtils.decodeBitmap(vFile.absolutePath, width, height) ?: throw NoStackTraceException("解析图片失败") - bitmapLruCache.put(src, bitmap) + bitmapLruCache.put(vFile.absolutePath, bitmap) bitmap }.onFailure { //错误图片占位,防止重复获取 - bitmapLruCache.put(src, errorBitmap) + bitmapLruCache.put(vFile.absolutePath, errorBitmap) putDebug( "ImageProvider: decode bitmap failed. path: ${vFile.absolutePath}\n$it", it