This commit is contained in:
Horis
2024-02-25 12:41:01 +08:00
parent 6d8deca130
commit e352a8a148
3 changed files with 42 additions and 10 deletions
@@ -31,6 +31,7 @@ import io.legado.app.ui.book.read.page.provider.ChapterProvider
import io.legado.app.ui.book.read.page.provider.LayoutProgressListener import io.legado.app.ui.book.read.page.provider.LayoutProgressListener
import io.legado.app.ui.book.read.page.provider.TextPageFactory import io.legado.app.ui.book.read.page.provider.TextPageFactory
import io.legado.app.utils.activity import io.legado.app.utils.activity
import io.legado.app.utils.canvasrecorder.pools.BitmapPool
import io.legado.app.utils.invisible import io.legado.app.utils.invisible
import io.legado.app.utils.showDialogFragment import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.throttle import io.legado.app.utils.throttle
@@ -461,6 +462,7 @@ class ReadView(context: Context, attrs: AttributeSet) :
pageDelegate?.onDestroy() pageDelegate?.onDestroy()
curPage.cancelSelect() curPage.cancelSelect()
invalidateTextPage() invalidateTextPage()
BitmapPool.clear()
} }
/** /**
@@ -16,14 +16,14 @@ class CanvasRecorderImpl : BaseCanvasRecorder() {
private fun init(width: Int, height: Int) { private fun init(width: Int, height: Int) {
if (bitmap == null) { if (bitmap == null) {
bitmap = bitmapPool.obtain(width, height) bitmap = BitmapPool.obtain(width, height)
} }
if (bitmap!!.width != width || bitmap!!.height != height) { if (bitmap!!.width != width || bitmap!!.height != height) {
if (canReconfigure(width, height)) { if (canReconfigure(width, height)) {
bitmap!!.reconfigure(width, height, Bitmap.Config.ARGB_8888) bitmap!!.reconfigure(width, height, Bitmap.Config.ARGB_8888)
} else { } else {
bitmapPool.recycle(bitmap!!) BitmapPool.recycle(bitmap!!)
bitmap = bitmapPool.obtain(width, height) bitmap = BitmapPool.obtain(width, height)
} }
} }
} }
@@ -54,13 +54,12 @@ class CanvasRecorderImpl : BaseCanvasRecorder() {
override fun recycle() { override fun recycle() {
super.recycle() super.recycle()
val bitmap = bitmap ?: return val bitmap = bitmap ?: return
bitmapPool.recycle(bitmap) BitmapPool.recycle(bitmap)
this.bitmap = null this.bitmap = null
} }
companion object { companion object {
private val canvasPool = CanvasPool(2) private val canvasPool = CanvasPool(2)
private val bitmapPool = BitmapPool()
} }
} }
@@ -1,15 +1,46 @@
package io.legado.app.utils.canvasrecorder.pools package io.legado.app.utils.canvasrecorder.pools
import android.graphics.Bitmap import android.graphics.Bitmap
import java.lang.ref.SoftReference import io.legado.app.help.globalExecutor
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
class BitmapPool { object BitmapPool {
private val reusableBitmaps: MutableSet<SoftReference<Bitmap>> = ConcurrentHashMap.newKeySet() private val reusableBitmaps: MutableSet<Bitmap> = ConcurrentHashMap.newKeySet()
fun recycle(bitmap: Bitmap) { fun recycle(bitmap: Bitmap) {
reusableBitmaps.add(SoftReference(bitmap)) reusableBitmaps.add(bitmap)
trimSize()
}
fun clear() {
if (reusableBitmaps.isEmpty()) {
return
}
globalExecutor.execute {
val iterator = reusableBitmaps.iterator()
while (iterator.hasNext()) {
val item = iterator.next()
iterator.remove()
item.recycle()
}
}
}
private fun trimSize() {
globalExecutor.execute {
var byteCount = 0
val iterator = reusableBitmaps.iterator()
while (iterator.hasNext()) {
val item = iterator.next()
if (byteCount > 64 * 1024 * 1024) {
iterator.remove()
item.recycle()
} else {
byteCount += item.byteCount
}
}
}
} }
fun obtain(width: Int, height: Int): Bitmap { fun obtain(width: Int, height: Int): Bitmap {
@@ -18,7 +49,7 @@ class BitmapPool {
} }
val iterator = reusableBitmaps.iterator() val iterator = reusableBitmaps.iterator()
while (iterator.hasNext()) { while (iterator.hasNext()) {
val item = iterator.next().get() ?: continue val item = iterator.next()
if (item.isMutable) { if (item.isMutable) {
// Check to see it the item can be used for inBitmap. // Check to see it the item can be used for inBitmap.
if (canReconfigure(item, width, height)) { if (canReconfigure(item, width, height)) {