|
|
@@ -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<String, Bitmap>(cacheSize) {
|
|
|
+
|
|
|
+ val bitmapLruCache = BitmapLruCache()
|
|
|
+
|
|
|
+ class BitmapLruCache : LruCache<String, Bitmap>(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)
|
|
|
}
|
|
|
|