glide icon indicating copy to clipboard operation
glide copied to clipboard

If the same URL is read into the View, the RequestListener will be reused as stale.

Open Pluu opened this issue 1 year ago • 2 comments

As of Glide 4.16.0, stale instances of RequestListener are reused.

It is common to load images into a single ImageView with Glide. A new RequestListener should be used for each call to Glide, even if it is the same URL.

Up until Glide 4.15.1, newly created listeners are called, but starting in 4.16.0, old listener instances are called.

private fun loadImage(url: String) {
    val listener = object : RequestListener<Drawable> {
        override fun onLoadFailed(
            e: GlideException?,
            model: Any?,
            target: Target<Drawable>,
            isFirstResource: Boolean
        ): Boolean {
            Log.d("TAG", "[onLoadFailed] = ${hashCode()}")
            return false
        }

        override fun onResourceReady(
            resource: Drawable,
            model: Any,
            target: Target<Drawable>,
            dataSource: DataSource,
            isFirstResource: Boolean
        ): Boolean {
            Log.d("TAG", "[onResourceReady] = ${hashCode()}")
            return false
        }
    }

    Log.d("TAG", "[Listener] = ${listener.hashCode()} ==> $url")

    Glide.with(binding.imgView)
        .load(url)
        .centerCrop()
        .addListener(listener)
        .into(binding.imgView)
}

Demo project

  • sample : https://github.com/Pluu/GlideListenerBugSample

Glide 4.15.1

Glide 4.16.0

Pluu avatar Nov 21 '23 14:11 Pluu

8f6d64519574c9a199f96269f56fae8ffb942b4f This commit fixes the code related to equals.

Previously, the comparison of localRequestOptions and otherLocalRequestOptions using equals behaved as RequestBuilder.equals, returning false when adding another Listener.

However, now it seems to have happened because the comparison of bothBaseRequestOptionsNullEquivalentOrEquals is done using the equals function, so it behaves the same as the equals function in BaseRequestOptions, so requestListeners returns true even if another Listener is added.

4.15.1

https://github.com/bumptech/glide/blob/facc541119ae523d0d489fe9a057dc1d2221afaa/library/src/main/java/com/bumptech/glide/request/SingleRequest.java#L773C2-L773C31

4.16.0

https://github.com/bumptech/glide/blob/3bbc3908edd8432f55ccfae3257bad533c1bf7d1/library/src/main/java/com/bumptech/glide/request/SingleRequest.java#L781

cc @mori-atsushi @sjudd @Pluu

MoonJR avatar Nov 22 '23 04:11 MoonJR

我这边验证,4.15.0 4.15.1,4.14.2,都有这个问题,你确定4.15.1正常吗?

marchlqq avatar Jan 09 '24 10:01 marchlqq