优化
Some checks failed
Test Build / prepare (push) Has been cancelled
Test Build / build (app, release) (push) Has been cancelled
Test Build / build (app, releaseA) (push) Has been cancelled
Test Build / prerelease (push) Has been cancelled
Test Build / lanzou (push) Has been cancelled
Test Build / test_Branch (push) Has been cancelled
Test Build / telegram (push) Has been cancelled

This commit is contained in:
Horis
2025-01-28 11:13:48 +08:00
parent 86d424f854
commit fae0dd6ded
4 changed files with 52 additions and 57 deletions

View File

@@ -8,7 +8,6 @@ import androidx.annotation.DrawableRes
import androidx.lifecycle.Lifecycle
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestBuilder
import com.bumptech.glide.request.RequestOptions
import io.legado.app.utils.isAbsUrl
import io.legado.app.utils.isContentScheme
import io.legado.app.utils.isDataUrl
@@ -55,8 +54,7 @@ object ImageLoader {
}
fun loadBitmap(context: Context, path: String?): RequestBuilder<Bitmap> {
val requestManager = Glide.with(context).asBitmap()
.apply(RequestOptions.decodeTypeOf(Any::class.java))
val requestManager = Glide.with(context).`as`(Bitmap::class.java)
return when {
path.isNullOrEmpty() -> requestManager.load(path)
path.isDataUrl() -> requestManager.load(path)

View File

@@ -75,6 +75,10 @@ object ImageProvider {
return bitmapLruCache.get(key)
}
fun remove(key: String): Bitmap? {
return bitmapLruCache.remove(key)
}
private fun getNotRecycled(key: String): Bitmap? {
val bitmap = bitmapLruCache.get(key) ?: return null
if (bitmap.isRecycled) {

View File

@@ -2,21 +2,20 @@ package io.legado.app.ui.association
import android.annotation.SuppressLint
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar
import androidx.core.graphics.drawable.toBitmap
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.bumptech.glide.request.target.Target
import io.legado.app.R
import io.legado.app.base.BaseDialogFragment
import io.legado.app.databinding.DialogVerificationCodeViewBinding
import io.legado.app.help.CacheManager
import io.legado.app.help.glide.ImageLoader
import io.legado.app.help.glide.OkHttpModelLoader
import io.legado.app.help.source.SourceVerificationHelp
@@ -79,37 +78,37 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification
@SuppressLint("CheckResult")
private fun loadImage(url: String, sourceUrl: String?) {
ImageProvider.bitmapLruCache.remove(url)
ImageProvider.remove(url)
ImageLoader.loadBitmap(requireContext(), url).apply {
sourceUrl?.let {
apply(
RequestOptions().set(OkHttpModelLoader.sourceOriginOption, it)
)
apply(RequestOptions().set(OkHttpModelLoader.sourceOriginOption, it))
}
}.error(R.drawable.image_loading_error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(object : CustomTarget<Bitmap>() {
override fun onLoadFailed(errorDrawable: Drawable?) {
errorDrawable?.toBitmap()?.let {
onResourceReady(it, null)
}
.listener(object : RequestListener<Bitmap> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Bitmap?>,
isFirstResource: Boolean
): Boolean {
return false
}
override fun onResourceReady(
resource: Bitmap,
transition: Transition<in Bitmap>?
) {
view ?: return
val bitmap = resource.copy(resource.config ?: Bitmap.Config.ARGB_8888, true)
ImageProvider.bitmapLruCache.put(url, bitmap)
binding.verificationCodeImageView.setImageBitmap(bitmap)
}
override fun onLoadCleared(placeholder: Drawable?) {
// do nothing
model: Any,
target: Target<Bitmap?>?,
dataSource: DataSource,
isFirstResource: Boolean
): Boolean {
val bitmap = resource.copy(resource.config!!, true)
ImageProvider.put(url, bitmap) // 传给 PhotoDialog
return false
}
})
.into(binding.verificationCodeImageView)
}
@SuppressLint("InflateParams")

View File

@@ -41,36 +41,30 @@ class PhotoDialog() : BaseDialogFragment(R.layout.dialog_photo_view) {
@SuppressLint("CheckResult")
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
val arguments = arguments ?: return
arguments.getString("src")?.let { src ->
ImageProvider.bitmapLruCache.get(src)?.let {
binding.photoView.setImageBitmap(it)
return
}
val file = ReadBook.book?.let { book ->
BookHelp.getImage(book, src)
}
if (file?.exists() == true) {
ImageLoader.load(requireContext(), file)
.error(R.drawable.image_loading_error)
.dontTransform()
.downsample(DownsampleStrategy.NONE)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(binding.photoView)
} else {
ImageLoader.load(requireContext(), src).apply {
arguments.getString("sourceOrigin")?.let { sourceOrigin ->
apply(
RequestOptions().set(
OkHttpModelLoader.sourceOriginOption,
sourceOrigin
)
)
}
}.error(BookCover.defaultDrawable)
.dontTransform()
.downsample(DownsampleStrategy.NONE)
.into(binding.photoView)
}
val src = arguments.getString("src") ?: return
ImageProvider.get(src)?.let {
binding.photoView.setImageBitmap(it)
return
}
val file = ReadBook.book?.let { book ->
BookHelp.getImage(book, src)
}
if (file?.exists() == true) {
ImageLoader.load(requireContext(), file)
.error(R.drawable.image_loading_error)
.dontTransform()
.downsample(DownsampleStrategy.NONE)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(binding.photoView)
} else {
ImageLoader.load(requireContext(), src).apply {
arguments.getString("sourceOrigin")?.let { sourceOrigin ->
apply(RequestOptions().set(OkHttpModelLoader.sourceOriginOption, sourceOrigin))
}
}.error(BookCover.defaultDrawable)
.dontTransform()
.downsample(DownsampleStrategy.NONE)
.into(binding.photoView)
}
}