Fix clear glide in recycler view

This commit is contained in:
Valere 2020-08-10 14:59:31 +02:00
parent 31eccf5f1c
commit 5f76f182f6
9 changed files with 32 additions and 4 deletions

View File

@ -23,7 +23,6 @@ import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.core.view.isVisible import androidx.core.view.isVisible
import im.vector.app.R import im.vector.app.R
import im.vector.app.core.glide.GlideApp
import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.AvatarRenderer
import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptData import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptData
import im.vector.app.features.home.room.detail.timeline.item.toMatrixItem import im.vector.app.features.home.room.detail.timeline.item.toMatrixItem
@ -113,9 +112,9 @@ class ReadReceiptsView @JvmOverloads constructor(
} }
} }
fun unbind() { fun unbind(avatarRenderer: AvatarRenderer?) {
receiptAvatars.forEach { receiptAvatars.forEach {
GlideApp.with(context.applicationContext).clear(it) avatarRenderer?.clear(it)
} }
isVisible = false isVisible = false
} }

View File

@ -56,6 +56,11 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
DrawableImageViewTarget(imageView)) DrawableImageViewTarget(imageView))
} }
fun clear(imageView: ImageView) {
// It can be called after recycler view is destroyed, just silently catch
tryThis { GlideApp.with(imageView).clear(imageView) }
}
@UiThread @UiThread
fun render(matrixItem: MatrixItem, imageView: ImageView, glideRequests: GlideRequests) { fun render(matrixItem: MatrixItem, imageView: ImageView, glideRequests: GlideRequests) {
render(imageView.context, render(imageView.context,

View File

@ -110,7 +110,7 @@ abstract class AbsBaseMessageItem<H : AbsBaseMessageItem.Holder> : BaseEventItem
override fun unbind(holder: H) { override fun unbind(holder: H) {
holder.reactionsContainer.setOnLongClickListener(null) holder.reactionsContainer.setOnLongClickListener(null)
holder.readReceiptsView.unbind() holder.readReceiptsView.unbind(baseAttributes.avatarRenderer)
super.unbind(holder) super.unbind(holder)
} }

View File

@ -77,6 +77,7 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : AbsBaseMessageItem<H>
} }
override fun unbind(holder: H) { override fun unbind(holder: H) {
attributes.avatarRenderer.clear(holder.avatarImageView)
holder.avatarImageView.setOnClickListener(null) holder.avatarImageView.setOnClickListener(null)
holder.avatarImageView.setOnLongClickListener(null) holder.avatarImageView.setOnLongClickListener(null)
holder.memberNameView.setOnClickListener(null) holder.memberNameView.setOnClickListener(null)

View File

@ -44,6 +44,12 @@ abstract class DefaultItem : BaseEventItem<DefaultItem.Holder>() {
holder.readReceiptsView.render(attributes.informationData.readReceipts, attributes.avatarRenderer, _readReceiptsClickListener) holder.readReceiptsView.render(attributes.informationData.readReceipts, attributes.avatarRenderer, _readReceiptsClickListener)
} }
override fun unbind(holder: Holder) {
attributes.avatarRenderer.clear(holder.avatarImageView)
holder.readReceiptsView.unbind(attributes.avatarRenderer)
super.unbind(holder)
}
override fun getEventIds(): List<String> { override fun getEventIds(): List<String> {
return listOf(attributes.informationData.eventId) return listOf(attributes.informationData.eventId)
} }

View File

@ -68,6 +68,7 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
override fun unbind(holder: Holder) { override fun unbind(holder: Holder) {
GlideApp.with(holder.view.context.applicationContext).clear(holder.imageView) GlideApp.with(holder.view.context.applicationContext).clear(holder.imageView)
imageContentRenderer.clear(holder.imageView)
contentUploadStateTrackerBinder.unbind(attributes.informationData.eventId) contentUploadStateTrackerBinder.unbind(attributes.informationData.eventId)
holder.imageView.setOnClickListener(null) holder.imageView.setOnClickListener(null)
holder.imageView.setOnLongClickListener(null) holder.imageView.setOnLongClickListener(null)

View File

@ -60,6 +60,12 @@ abstract class NoticeItem : BaseEventItem<NoticeItem.Holder>() {
} }
} }
override fun unbind(holder: Holder) {
attributes.avatarRenderer.clear(holder.avatarImageView)
holder.readReceiptsView.unbind(attributes.avatarRenderer)
super.unbind(holder)
}
override fun getEventIds(): List<String> { override fun getEventIds(): List<String> {
return listOf(attributes.informationData.eventId) return listOf(attributes.informationData.eventId)
} }

View File

@ -82,6 +82,7 @@ abstract class RoomSummaryItem : VectorEpoxyModel<RoomSummaryItem.Holder>() {
override fun unbind(holder: Holder) { override fun unbind(holder: Holder) {
holder.rootView.setOnClickListener(null) holder.rootView.setOnClickListener(null)
holder.rootView.setOnLongClickListener(null) holder.rootView.setOnLongClickListener(null)
avatarRenderer.clear(holder.avatarImageView)
super.unbind(holder) super.unbind(holder)
} }

View File

@ -103,6 +103,15 @@ class ImageContentRenderer @Inject constructor(private val activeSessionHolder:
.into(imageView) .into(imageView)
} }
fun clear(imageView: ImageView) {
// It can be called after recycler view is destroyed, just silently catch
// We'd better keep ref to requestManager, but we don't have it
tryThis {
GlideApp
.with(imageView).clear(imageView)
}
}
fun render(data: Data, contextView: View, target: CustomViewTarget<*, Drawable>) { fun render(data: Data, contextView: View, target: CustomViewTarget<*, Drawable>) {
val req = if (data.elementToDecrypt != null) { val req = if (data.elementToDecrypt != null) {
// Encrypted image // Encrypted image