From cc99eb1f03a3cb2cf5b2b91f4e1253aa24f0e433 Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Thu, 15 Feb 2024 15:56:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/constant/PreferKey.kt | 1 - .../io/legado/app/help/config/AppConfig.kt | 2 - .../java/io/legado/app/model/ImageProvider.kt | 39 +------ .../app/ui/book/read/ReadBookActivity.kt | 4 +- .../read/page/entities/column/ImageColumn.kt | 5 +- .../java/io/legado/app/utils/BitmapCache.kt | 104 ------------------ .../java/io/legado/app/utils/BitmapUtils.kt | 1 - app/src/main/res/xml/pref_config_read.xml | 7 -- 8 files changed, 5 insertions(+), 158 deletions(-) delete mode 100644 app/src/main/java/io/legado/app/utils/BitmapCache.kt diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index d8995cec7..fd109f3ef 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -117,7 +117,6 @@ object PreferKey { const val welcomeShowIconDark = "welcomeShowIconDark" const val pageTouchSlop = "pageTouchSlop" const val showAddToShelfAlert = "showAddToShelfAlert" - const val asyncLoadImage = "asyncLoadImage" const val ignoreAudioFocus = "ignoreAudioFocus" const val parallelExportBook = "parallelExportBook" const val progressBarBehavior = "progressBarBehavior" diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index 9563699b8..b719f1d45 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -460,8 +460,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { val showAddToShelfAlert get() = appCtx.getPrefBoolean(PreferKey.showAddToShelfAlert, true) - val asyncLoadImage get() = appCtx.getPrefBoolean(PreferKey.asyncLoadImage, false) - val ignoreAudioFocus get() = appCtx.getPrefBoolean(PreferKey.ignoreAudioFocus, false) val onlyLatestBackup get() = appCtx.getPrefBoolean(PreferKey.onlyLatestBackup, true) 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 1bb69b7ae..81a256327 100644 --- a/app/src/main/java/io/legado/app/model/ImageProvider.kt +++ b/app/src/main/java/io/legado/app/model/ImageProvider.kt @@ -6,9 +6,7 @@ import android.os.Build import android.util.Size import androidx.collection.LruCache import io.legado.app.R -import io.legado.app.constant.AppLog import io.legado.app.constant.AppLog.putDebug -import io.legado.app.constant.PageAnim import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookSource import io.legado.app.exception.NoStackTraceException @@ -16,10 +14,8 @@ import io.legado.app.help.book.BookHelp import io.legado.app.help.book.isEpub import io.legado.app.help.book.isPdf import io.legado.app.help.config.AppConfig -import io.legado.app.help.coroutine.Coroutine import io.legado.app.model.localBook.EpubFile import io.legado.app.model.localBook.PdfFile -import io.legado.app.utils.BitmapCache import io.legado.app.utils.BitmapUtils import io.legado.app.utils.FileUtils import io.legado.app.utils.SvgUtils @@ -70,8 +66,7 @@ object ImageProvider { ) { //错误图片不能释放,占位用,防止一直重复获取图片 if (oldBitmap != errorBitmap) { - BitmapCache.add(oldBitmap) - //oldBitmap.recycle() + oldBitmap.recycle() //putDebug("ImageProvider: trigger bitmap recycle. URI: $filePath") //putDebug("ImageProvider : cacheUsage ${size()}bytes / ${maxSize()}bytes") } @@ -160,9 +155,8 @@ object ImageProvider { book: Book, src: String, width: Int, - height: Int? = null, - block: (() -> Unit)? = null - ): Bitmap? { + height: Int? = null + ): Bitmap { //src为空白时 可能被净化替换掉了 或者规则失效 if (book.getUseReplaceRule() && src.isBlank()) { book.setUseReplaceRule(false) @@ -174,32 +168,6 @@ object ImageProvider { //bitmapLruCache的key同一改成缓存文件的路径 val cacheBitmap = getNotRecycled(vFile.absolutePath) if (cacheBitmap != null) return cacheBitmap - if (height != null && AppConfig.asyncLoadImage && ReadBook.pageAnim() == PageAnim.scrollPageAnim) { - if (asyncLoadingImages.contains(vFile.absolutePath)) { - return null - } - asyncLoadingImages.add(vFile.absolutePath) - Coroutine.async { - BitmapUtils.decodeBitmap(vFile.absolutePath, width, height) - ?: SvgUtils.createBitmap(vFile.absolutePath, width, height) - ?: throw NoStackTraceException(appCtx.getString(R.string.error_decode_bitmap)) - }.onSuccess { - bitmapLruCache.run { - if (maxSize() < maxCacheSize && size() + it.byteCount > maxSize() && putCount() - evictionCount() < 5) { - resize(min(maxCacheSize, maxSize() + it.byteCount)) - AppLog.put("图片缓存太小,自动扩增至${(maxSize() / M)}MB。") - } - } - bitmapLruCache.put(vFile.absolutePath, it) - }.onError { - //错误图片占位,防止重复获取 - bitmapLruCache.put(vFile.absolutePath, errorBitmap) - }.onFinally { - asyncLoadingImages.remove(vFile.absolutePath) - block?.invoke() - } - return null - } return kotlin.runCatching { val bitmap = BitmapUtils.decodeBitmap(vFile.absolutePath, width, height) ?: SvgUtils.createBitmap(vFile.absolutePath, width, height) @@ -214,7 +182,6 @@ object ImageProvider { fun clear() { bitmapLruCache.evictAll() - BitmapCache.clear() } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 28623edb5..55573449e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -964,9 +964,7 @@ class ReadBookActivity : BaseReadBookActivity(), */ override fun pageChanged() { pageChanged = true - runOnUiThread { - binding.readView.onPageChange() - } + binding.readView.onPageChange() handler.post { upSeekBarProgress() } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/ImageColumn.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/ImageColumn.kt index 39275c8c0..084d8d320 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/ImageColumn.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/ImageColumn.kt @@ -32,10 +32,7 @@ data class ImageColumn( src, (end - start).toInt(), height.toInt() - ) { - textLine.invalidate() - view.invalidate() - } ?: return + ) val rectF = if (textLine.isImage) { RectF(start, 0f, end, height) diff --git a/app/src/main/java/io/legado/app/utils/BitmapCache.kt b/app/src/main/java/io/legado/app/utils/BitmapCache.kt deleted file mode 100644 index 37b831b8b..000000000 --- a/app/src/main/java/io/legado/app/utils/BitmapCache.kt +++ /dev/null @@ -1,104 +0,0 @@ -package io.legado.app.utils - -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import java.lang.ref.SoftReference -import java.util.concurrent.ConcurrentHashMap - -object BitmapCache { - - private val reusableBitmaps: MutableSet> = ConcurrentHashMap.newKeySet() - - fun add(bitmap: Bitmap) { - reusableBitmaps.add(SoftReference(bitmap)) - trimSize() - } - - fun clear() { - if (reusableBitmaps.isEmpty()) { - return - } - val iterator = reusableBitmaps.iterator() - while (iterator.hasNext()) { - val item = iterator.next().get() ?: continue - item.recycle() - iterator.remove() - } - } - - private fun trimSize() { - var byteCount = 0 - val iterator = reusableBitmaps.iterator() - while (iterator.hasNext()) { - val item = iterator.next().get() ?: continue - if (byteCount > 128 * 1024 * 1024) { - item.recycle() - iterator.remove() - } else { - byteCount += item.byteCount - } - } - } - - fun addInBitmapOptions(options: BitmapFactory.Options) { - // inBitmap only works with mutable bitmaps, so force the decoder to - // return mutable bitmaps. - options.inMutable = true - - // Try to find a bitmap to use for inBitmap. - getBitmapFromReusableSet(options)?.also { inBitmap -> - // If a suitable bitmap has been found, set it as the value of - // inBitmap. - options.inBitmap = inBitmap - } - } - - - private fun getBitmapFromReusableSet(options: BitmapFactory.Options): Bitmap? { - if (reusableBitmaps.isEmpty()) { - return null - } - val iterator = reusableBitmaps.iterator() - while (iterator.hasNext()) { - val item = iterator.next().get() ?: continue - if (item.isMutable) { - // Check to see it the item can be used for inBitmap. - if (canUseForInBitmap(item, options)) { - // Remove from reusable set so it can't be used again. - iterator.remove() - return item - } - } else { - // Remove from the set if the reference has been cleared. - iterator.remove() - } - } - return null - } - - private fun canUseForInBitmap( - candidate: Bitmap, - targetOptions: BitmapFactory.Options - ): Boolean { - // From Android 4.4 (KitKat) onward we can re-use if the byte size of - // the new bitmap is smaller than the reusable bitmap candidate - // allocation byte count. - val width: Int = targetOptions.outWidth / targetOptions.inSampleSize - val height: Int = targetOptions.outHeight / targetOptions.inSampleSize - val byteCount: Int = width * height * getBytesPerPixel(candidate.config) - return byteCount <= candidate.allocationByteCount - } - - /** - * A helper function to return the byte usage per pixel of a bitmap based on its configuration. - */ - private fun getBytesPerPixel(config: Bitmap.Config): Int { - return when (config) { - Bitmap.Config.ARGB_8888 -> 4 - Bitmap.Config.RGB_565, Bitmap.Config.ARGB_4444 -> 2 - Bitmap.Config.ALPHA_8 -> 1 - else -> 1 - } - } - -} diff --git a/app/src/main/java/io/legado/app/utils/BitmapUtils.kt b/app/src/main/java/io/legado/app/utils/BitmapUtils.kt index e962b5a43..80c19e88f 100644 --- a/app/src/main/java/io/legado/app/utils/BitmapUtils.kt +++ b/app/src/main/java/io/legado/app/utils/BitmapUtils.kt @@ -34,7 +34,6 @@ object BitmapUtils { BitmapFactory.decodeFileDescriptor(fis.fd, null, op) op.inSampleSize = calculateInSampleSize(op, width, height) op.inJustDecodeBounds = false - BitmapCache.addInBitmapOptions(op) BitmapFactory.decodeFileDescriptor(fis.fd, null, op) } } diff --git a/app/src/main/res/xml/pref_config_read.xml b/app/src/main/res/xml/pref_config_read.xml index 045303a6d..b6fa78c39 100644 --- a/app/src/main/res/xml/pref_config_read.xml +++ b/app/src/main/res/xml/pref_config_read.xml @@ -136,13 +136,6 @@ app:iconSpaceReserved="false" app:isBottomBackground="true" /> - -