LoadableImageView bitmap leak fix when view is placed into view pool

commit_hash:fe4d0028e8dbaf64b64170f170b9ca2f4d6cad95
This commit is contained in:
gurevichmi
2025-06-17 05:05:23 +03:00
parent 78b423cb87
commit cadef1850f
6 changed files with 30 additions and 10 deletions
@@ -35,4 +35,10 @@ internal open class DivGifImageView @JvmOverloads constructor(
override fun draw(canvas: Canvas) {
drawBorderClipped(canvas) { super.draw(it) }
}
override fun release() {
super<LoadableImageView>.release()
super<DivHolderView>.release()
gifUrl = null
}
}
@@ -13,6 +13,13 @@ internal interface DivHolderView<T: Div> : DivBorderSupports,
var div: T?
var bindingContext: BindingContext?
override fun release() {
super.release()
div = null
bindingContext = null
releaseBorderDrawer()
}
}
internal class DivHolderViewMixin<T: Div> : DivHolderView<T>,
@@ -24,11 +31,4 @@ internal class DivHolderViewMixin<T: Div> : DivHolderView<T>,
override var bindingContext: BindingContext? = null
override val subscriptions = mutableListOf<Disposable>()
override fun release() {
super.release()
div = null
bindingContext = null
releaseBorderDrawer()
}
}
@@ -38,4 +38,10 @@ internal open class DivImageView @JvmOverloads constructor(
override fun draw(canvas: Canvas) {
drawBorderClipped(canvas) { super.draw(it) }
}
override fun release() {
super<LoadableImageView>.release()
super<DivHolderView>.release()
imageUrl = null
}
}
@@ -211,7 +211,6 @@ internal class DivRecyclerView @JvmOverloads constructor(
override fun release() {
super.release()
releaseBorderDrawer()
val currentAdapter = adapter
if (currentAdapter is Releasable) {
currentAdapter.release()
@@ -36,7 +36,6 @@ internal class DivVideoView @JvmOverloads constructor(
playerView.detach()
lastPlayer?.release()
}
releaseBorderDrawer()
}
fun getPlayerView(): DivPlayerView? {
@@ -14,6 +14,7 @@ import android.view.ViewGroup
import androidx.annotation.CallSuper
import com.yandex.div.R
import com.yandex.div.core.images.LoadReference
import com.yandex.div.core.view2.Releasable
import com.yandex.div.core.view2.divs.widgets.LoadableImage
import com.yandex.div.core.view2.drawable.ScaleDrawable
import com.yandex.div.internal.widget.AspectImageView
@@ -24,7 +25,7 @@ open class LoadableImageView(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : AspectImageView(context, attrs, defStyleAttr), LoadableImage, DivExtendableView {
) : AspectImageView(context, attrs, defStyleAttr), LoadableImage, DivExtendableView, Releasable {
@Deprecated("Use imageTransform instead")
internal var currentBitmapWithoutFilters: Bitmap? = null
@@ -185,6 +186,15 @@ open class LoadableImageView(
imageChangeCallback = callback
}
override fun release() {
currentBitmapWithoutFilters = null
externalImage = null
sourceDrawable = null
resetImageLoaded()
getLoadingTask()?.cancel(true)
cleanLoadingTask()
}
interface ImageTransformer {
fun transform(drawable: Drawable?): Drawable?