diff --git a/app/src/main/java/io/legado/app/model/ImageProvider.kt b/app/src/main/java/io/legado/app/model/ImageProvider.kt index d2a3da50b..861b7afbe 100644 --- a/app/src/main/java/io/legado/app/model/ImageProvider.kt +++ b/app/src/main/java/io/legado/app/model/ImageProvider.kt @@ -26,6 +26,7 @@ import kotlinx.coroutines.withContext import splitties.init.appCtx import java.io.File import java.io.FileOutputStream +import kotlin.math.min object ImageProvider { @@ -45,7 +46,14 @@ object ImageProvider { } return AppConfig.bitmapCacheSize * M } - val bitmapLruCache = object : LruCache(cacheSize) { + + val bitmapLruCache = BitmapLruCache() + + class BitmapLruCache : LruCache(cacheSize) { + + private var removeCount = 0 + + val count get() = putCount() + createCount() - evictionCount() - removeCount override fun sizeOf(filePath: String, bitmap: Bitmap): Int { return bitmap.byteCount @@ -57,6 +65,11 @@ object ImageProvider { oldBitmap: Bitmap, newBitmap: Bitmap? ) { + if (!evicted) { + synchronized(this) { + removeCount++ + } + } //错误图片不能释放,占位用,防止一直重复获取图片 if (oldBitmap != errorBitmap) { oldBitmap.recycle() @@ -68,6 +81,7 @@ object ImageProvider { } fun put(key: String, bitmap: Bitmap) { + ensureLruCacheSize(bitmap) bitmapLruCache.put(key, bitmap) } @@ -88,6 +102,22 @@ object ImageProvider { return bitmap } + private fun ensureLruCacheSize(bitmap: Bitmap) { + val lruMaxSize = bitmapLruCache.maxSize() + val lruSize = bitmapLruCache.size() + val byteCount = bitmap.byteCount + val size = if (byteCount > lruMaxSize) { + min(256 * M, (byteCount * 1.3).toInt()) + } else if (lruSize + byteCount > lruMaxSize && bitmapLruCache.count < 5) { + min(256 * M, (lruSize + byteCount * 1.3).toInt()) + } else { + lruMaxSize + } + if (size > lruMaxSize) { + bitmapLruCache.resize(size) + } + } + /** *缓存网络图片和epub图片 */ @@ -167,11 +197,11 @@ object ImageProvider { val bitmap = BitmapUtils.decodeBitmap(vFile.absolutePath, width, height) ?: SvgUtils.createBitmap(vFile.absolutePath, width, height) ?: throw NoStackTraceException(appCtx.getString(R.string.error_decode_bitmap)) - bitmapLruCache.put(vFile.absolutePath, bitmap) + put(vFile.absolutePath, bitmap) bitmap }.onFailure { //错误图片占位,防止重复获取 - bitmapLruCache.put(vFile.absolutePath, errorBitmap) + put(vFile.absolutePath, errorBitmap) }.getOrDefault(errorBitmap) } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt index 48dd72f6c..868b2cfd1 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt @@ -292,7 +292,13 @@ class TxtTocRuleDialog() : BaseDialogFragment(R.layout.dialog_toc_regex), } ivDelete.setOnClickListener { getItem(holder.layoutPosition)?.let { item -> - viewModel.del(item) + alert(R.string.draw) { + setMessage(getString(R.string.sure_del) + "\n" + item.name) + noButton() + yesButton { + viewModel.del(item) + } + } } } } diff --git a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleActivity.kt b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleActivity.kt index 67489a24c..bf58aef4f 100644 --- a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleActivity.kt @@ -140,6 +140,7 @@ class DictRuleActivity : VMBaseActivity showImportDialog() R.id.menu_import_qr -> qrCodeResult.launch() R.id.menu_import_default -> viewModel.importDefault() @@ -150,8 +151,14 @@ class DictRuleActivity : VMBaseActivity viewModel.enableSelection(*adapter.selection.toTypedArray()) - R.id.menu_disable_selection -> viewModel.disableSelection(*adapter.selection.toTypedArray()) + R.id.menu_enable_selection -> { + viewModel.enableSelection(*adapter.selection.toTypedArray()) + } + + R.id.menu_disable_selection -> { + viewModel.disableSelection(*adapter.selection.toTypedArray()) + } + R.id.menu_export_selection -> exportResult.launch { mode = HandleFileContract.EXPORT fileData = HandleFileContract.FileData( @@ -185,7 +192,13 @@ class DictRuleActivity : VMBaseActivity