Слушателят на Glide не работи

Използвам Glide за зареждане на изображения и добавих слушател, за да знам кога ресурсът е готов или има грешка от всякакъв тип:

Glide.with(mContext)
    .load(url)
    .placeholder(R.drawable.glide_placeholder)
    // use dontAnimate and not crossFade to avoid a bug with custom views
    .dontAnimate()
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .listener(new RequestListener<String, GlideDrawable>() {
        @Override
        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
            // do something
            return true;
        }

        @Override
        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
            // do something
            return true;
         }
    })
    .into(mCustomImageView);

Приложението никога не се изпълнява в onResourceReady или onException, но ако премахна слушателя и оставям async да се изтегли без обратно извикване, то работи правилно:

Glide.with(mContext)
    .load(url)
    .placeholder(R.drawable.glide_placeholder)
    // use dontAnimate and not crossFade to avoid a bug with custom views
    .dontAnimate()
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .into(mCustomImageView);

Опитах също с GlideDrawableImageViewTarget вместо слушател, за да получа обратни извиквания, но приложението работи вътре onLoadStarted, но никога не работи вътре onLoadCleared, onLoadFailed и onResourceReady.


person Giorgio Antonioli    schedule 10.09.2015    source източник
comment
Искате да кажете, че методите onException и onResourceReady на слушателя не се извикват? Връщането на true от тези методи ще предотврати извикването на Target, но те винаги трябва да се извикват за слушателя независимо от това.   -  person Sam Judd    schedule 11.09.2015
comment
Мисля, че трябва да се обадите на submit, за да го инициирате, за да започне зареждането   -  person android developer    schedule 13.12.2017


Отговори (7)


Изглежда, че има грешка с видимостта на ImageView, ако е невидима или изчезнала. Отворих проблем тук: https://github.com/bumptech/glide/issues/618

person Giorgio Antonioli    schedule 11.09.2015
comment
omg, преминавах от Picasso към Glide, но това беше неочаквано. Glide не извиква обратното извикване, ако изгледът все още е невидим :( - person Dr Deo; 14.02.2019

Ето един начин да го направите:

        Glide.with(context).load(...)
                .listener(object : RequestListener<Drawable> {
                    override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
                        //TODO handle error images while loading photo
                        return true
                    }

                    override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
                        //TODO use "resource" as the photo for your ImageView
                        return true
                    }

                }).submit()
person android developer    schedule 13.12.2017
comment
Хъ, това е странно, добавянето на .submit() изглежда е решило проблема от моя страна. Някаква идея каква промяна е направена, която кара .load(...) вече да не работи директно? Документите идват празни за мен. - person Sander van't Veer; 23.01.2018
comment
Мисля, че трябва да го инициирате в даден момент, защото без цел (или просто да му кажете да го направи), той не знае кога да извърши операцията. - person android developer; 23.01.2018
comment
не мога да пиша .into(imageview) след .submit() - person karthik kolanji; 18.05.2019
comment
@karthikkolanji Имате слушателя. Направете го в onResourceReady - person android developer; 18.05.2019

Попаднах на същия проблем. Като onResourceReady връща false, свърши работа за мен.

person Rik van Velzen    schedule 10.05.2016
comment
@styler1972 Добавих моя код, ако желаете погледнете. Изглежда, че работи добре в моя случай. - person android developer; 13.12.2017

Просто трябва да промените връщането на onResourceReady и onLoadFailed от true на false.

При мен работи на glide 4.9.1.

ако погледнете коментарите на RequestListener, трябва да разберете.

person Mehdi Yari    schedule 02.05.2019

Попаднах на същия проблем, тъй като ширината и височината на моя ImageView бяха 0,0 (и layout_width, и layout_height бяха зададени на wrap_content без първоначално изображението да беше зададено на ImageView). даването на ImageView на ширина и височина по подразбиране реши проблема ми.

person m3g4tr0n    schedule 18.09.2018
comment
По-добре осигурете кодиране, за да покажете как проблемът е решен. - person Chaska; 18.09.2018
comment
Същият проблем, тъй като видимостта на imageView беше .GONE. - person Manuel; 25.11.2019

Начинът на Kotlin за използване на Glide със слушател

Glide.with(context)
                .load(image_url)
                .listener(object : com.bumptech.glide.request.RequestListener<Drawable> {
                    override fun onLoadFailed(
                        e: GlideException?,
                        model: Any?,
                        target: Target<Drawable>?,
                        isFirstResource: Boolean
                    ): Boolean {
                        return false
                    }

                    override fun onResourceReady(
                        resource: Drawable?,
                        model: Any?,
                        target: Target<Drawable>?,
                        dataSource: DataSource?,
                        isFirstResource: Boolean
                    ): Boolean {
                        img_product_banner.visibility = View.VISIBLE
                        return false
                    }

                }).placeholder(R.drawable.placeholder)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(img_product_banner)
person Aditya Patil    schedule 19.09.2020

Това проработи при мен

try {
        Glide.with(context)
            .asBitmap()
            .load(characterDB.url)
            .listener(object : RequestListener<Bitmap> {
                override fun onResourceReady(
                    resource: Bitmap?,
                    model: Any?,
                    target: Target<Bitmap>?,
                    dataSource: DataSource?,
                    isFirstResource: Boolean
                ): Boolean {
                    return false
                }

                override fun onLoadFailed(
                    e: GlideException?,
                    model: Any?,
                    target: Target<Bitmap>?,
                    isFirstResource: Boolean
                ): Boolean {
                    return false
                }
            }
            )
            .submit()
    }
    catch (e : Exception)
    {
        Log.d("Excepion",e.message.toString())
    }
person Gilad Raz    schedule 08.11.2019