From 9ffbf1f6aaed8d58c9049d31118d4a4617c1ec65 Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Thu, 18 Jan 2024 10:06:20 +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 --- .../io/legado/app/help/glide/ImageLoader.kt | 19 +++++++++++++++ .../io/legado/app/ui/main/rss/RssAdapter.kt | 5 ++-- .../io/legado/app/ui/main/rss/RssFragment.kt | 2 +- .../app/utils/RequestManagerExtensions.kt | 24 +++++++++++++++++++ 4 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/io/legado/app/utils/RequestManagerExtensions.kt diff --git a/app/src/main/java/io/legado/app/help/glide/ImageLoader.kt b/app/src/main/java/io/legado/app/help/glide/ImageLoader.kt index 00b188107..18b6da548 100644 --- a/app/src/main/java/io/legado/app/help/glide/ImageLoader.kt +++ b/app/src/main/java/io/legado/app/help/glide/ImageLoader.kt @@ -5,11 +5,14 @@ import android.graphics.Bitmap import android.graphics.drawable.Drawable import android.net.Uri import androidx.annotation.DrawableRes +import androidx.lifecycle.Lifecycle import com.bumptech.glide.Glide import com.bumptech.glide.RequestBuilder import io.legado.app.utils.isAbsUrl import io.legado.app.utils.isContentScheme import io.legado.app.utils.isDataUrl +import io.legado.app.utils.lifecycle +import splitties.init.appCtx import java.io.File //https://bumptech.github.io/glide/doc/generatedapi.html @@ -34,6 +37,22 @@ object ImageLoader { } } + fun load(lifecycle: Lifecycle, path: String?): RequestBuilder { + val requestManager = Glide.with(appCtx).lifecycle(lifecycle) + return when { + path.isNullOrEmpty() -> requestManager.load(path) + path.isDataUrl() -> requestManager.load(path) + path.isAbsUrl() -> requestManager.load(path) + path.isContentScheme() -> requestManager.load(Uri.parse(path)) + + else -> kotlin.runCatching { + requestManager.load(File(path)) + }.getOrElse { + requestManager.load(path) + } + } + } + fun loadBitmap(context: Context, path: String?): RequestBuilder { return when { path.isNullOrEmpty() -> Glide.with(context).asBitmap().load(path) diff --git a/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt b/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt index bedf4eeab..256683122 100644 --- a/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt @@ -4,6 +4,7 @@ import android.content.Context import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.PopupMenu +import androidx.lifecycle.Lifecycle import com.bumptech.glide.request.RequestOptions import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder @@ -14,7 +15,7 @@ import io.legado.app.help.glide.ImageLoader import io.legado.app.help.glide.OkHttpModelLoader import splitties.views.onLongClick -class RssAdapter(context: Context, val callBack: CallBack) : +class RssAdapter(context: Context, val callBack: CallBack, val lifecycle: Lifecycle) : RecyclerAdapter(context) { override fun getViewBinding(parent: ViewGroup): ItemRssBinding { @@ -31,7 +32,7 @@ class RssAdapter(context: Context, val callBack: CallBack) : tvName.text = item.sourceName val options = RequestOptions() .set(OkHttpModelLoader.sourceOriginOption, item.sourceUrl) - ImageLoader.load(context, item.sourceIcon) + ImageLoader.load(lifecycle, item.sourceIcon) .apply(options) .centerCrop() .placeholder(R.drawable.image_rss) diff --git a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt index 03974f479..8cdd9796c 100644 --- a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt @@ -58,7 +58,7 @@ class RssFragment() : VMBaseFragment(R.layout.fragment_rss), private val binding by viewBinding(FragmentRssBinding::bind) override val viewModel by viewModels() - private val adapter by lazy { RssAdapter(requireContext(), this) } + private val adapter by lazy { RssAdapter(requireContext(), this, lifecycle) } private val searchView: SearchView by lazy { binding.titleBar.findViewById(R.id.search_view) } diff --git a/app/src/main/java/io/legado/app/utils/RequestManagerExtensions.kt b/app/src/main/java/io/legado/app/utils/RequestManagerExtensions.kt new file mode 100644 index 000000000..f4a068885 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/RequestManagerExtensions.kt @@ -0,0 +1,24 @@ +package io.legado.app.utils + +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import com.bumptech.glide.RequestManager + +fun RequestManager.lifecycle(lifecycle: Lifecycle): RequestManager { + + val observer = object : DefaultLifecycleObserver { + override fun onStart(owner: LifecycleOwner) = onStart() + override fun onStop(owner: LifecycleOwner) = onStop() + override fun onResume(owner: LifecycleOwner) = onStart() + override fun onPause(owner: LifecycleOwner) = onStop() + override fun onDestroy(owner: LifecycleOwner) { + onDestroy() + owner.lifecycle.removeObserver(this) + } + } + + lifecycle.addObserver(observer) + + return this +}