mirror of
https://github.com/gedoor/legado.git
synced 2024-07-06 23:47:49 +08:00
优化
This commit is contained in:
parent
6d8deca130
commit
e352a8a148
@ -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.TextPageFactory
|
||||
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.showDialogFragment
|
||||
import io.legado.app.utils.throttle
|
||||
@ -461,6 +462,7 @@ class ReadView(context: Context, attrs: AttributeSet) :
|
||||
pageDelegate?.onDestroy()
|
||||
curPage.cancelSelect()
|
||||
invalidateTextPage()
|
||||
BitmapPool.clear()
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -16,14 +16,14 @@ class CanvasRecorderImpl : BaseCanvasRecorder() {
|
||||
|
||||
private fun init(width: Int, height: Int) {
|
||||
if (bitmap == null) {
|
||||
bitmap = bitmapPool.obtain(width, height)
|
||||
bitmap = BitmapPool.obtain(width, height)
|
||||
}
|
||||
if (bitmap!!.width != width || bitmap!!.height != height) {
|
||||
if (canReconfigure(width, height)) {
|
||||
bitmap!!.reconfigure(width, height, Bitmap.Config.ARGB_8888)
|
||||
} else {
|
||||
bitmapPool.recycle(bitmap!!)
|
||||
bitmap = bitmapPool.obtain(width, height)
|
||||
BitmapPool.recycle(bitmap!!)
|
||||
bitmap = BitmapPool.obtain(width, height)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -54,13 +54,12 @@ class CanvasRecorderImpl : BaseCanvasRecorder() {
|
||||
override fun recycle() {
|
||||
super.recycle()
|
||||
val bitmap = bitmap ?: return
|
||||
bitmapPool.recycle(bitmap)
|
||||
BitmapPool.recycle(bitmap)
|
||||
this.bitmap = null
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val canvasPool = CanvasPool(2)
|
||||
private val bitmapPool = BitmapPool()
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,15 +1,46 @@
|
||||
package io.legado.app.utils.canvasrecorder.pools
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import java.lang.ref.SoftReference
|
||||
import io.legado.app.help.globalExecutor
|
||||
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) {
|
||||
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 {
|
||||
@ -18,7 +49,7 @@ class BitmapPool {
|
||||
}
|
||||
val iterator = reusableBitmaps.iterator()
|
||||
while (iterator.hasNext()) {
|
||||
val item = iterator.next().get() ?: continue
|
||||
val item = iterator.next()
|
||||
if (item.isMutable) {
|
||||
// Check to see it the item can be used for inBitmap.
|
||||
if (canReconfigure(item, width, height)) {
|
||||
|
Loading…
Reference in New Issue
Block a user