使用 Glide 刷新 ImageView

Posted

技术标签:

【中文标题】使用 Glide 刷新 ImageView【英文标题】:ImageView refresh with Glide 【发布时间】:2015-03-30 19:23:43 【问题描述】:

我有一个 ImageView 和一个使用 Glide 加载的图像:

Glide.with(ImageView.getContext())
    .load(url)
    .dontAnimate()
    .placeholder(R.drawable.placeholder)
    .signature(stringSignature)
    .into(new GlideDrawableImageViewTarget(ImageView) 
        @Override
        public void onResourceReady(GlideDrawable drawable, GlideAnimation anim) 
            super.onResourceReady(drawable, anim);
            progressBar.setVisibility(View.GONE);
        
    );

当我想刷新图像时,我只使用新签名再次运行相同的代码。它工作得很好,但是当开始新的加载时,可见图像立即消失了。

问题

是否可以将图像保留在 ImageView 中并在新图像下载后替换它?

【问题讨论】:

【参考方案1】:

这是预期的行为。 每次调用 .load(x) 时,Glide 都会对目标及其关联请求调用 .clear()。 这就是 Glide 能够处理其位图池的方式,否则它将无法知道何时回收位图。 为了实现这一点,你需要在两个 Target 之间切换,这里是核心思想:

    public <T> void loadNextImage(@NonNull T model,
                                  @NonNull BitmapTransformation... transformations) 
        //noinspection MagicNumber
        int hash = model.hashCode() + 31 * Arrays.hashCode(transformations);
        if (mLastLoadHash == hash) return;
        Glide.with(mContext).load(model).asBitmap().transform(transformations).into(mCurrentTarget);
        mLastLoadHash = hash;
    

Target mCurrentTarget;



private class DiaporamaViewTarget extends ViewTarget<ImageView, Bitmap> 

        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) 
            mLoadedDrawable = new BitmapDrawable(mImageView.getResources(), resource);
           // display the loaded image 
            mCurrentTarget = mPreviousTarget;

【讨论】:

注意:IIRC 一种情况未处理:小部件的 onStop / onStart 当设备从睡眠状态恢复时会导致崩溃。不过应该很容易打补丁。我计划在 glide 4 出来的时候写一个更好的版本 你好@Teovald,你有什么想法,如何在recyclerview适配器中使用它来处理多个图像?我尝试了一些修改,但对我没有任何效果:-( 你想直接把它用作 RecyclerView 项目吗?这似乎既棘手又昂贵。我想您应该特别注意跟踪单元格中最后加载的图像。顺便说一句,我正在等待 Glide 4 的正式发布,以便更干净地重写这个适配器。当我写这篇文章时,我的 min API 是 7,我可以使用 minAPI 16 更有效的绑定逻辑。 不是直接的,而是类似的东西;)我同意你的逻辑,但是怎么做呢?为什么 Glide 需要在加载之前调用 clear() 而不是之后,在准备附加新位图的时候? @PrimožKralj 你可以看看那里:gist.github.com/FrancoisBlavoet/f8db7faa9ae6328be327.【参考方案2】:

您可以在下次加载时将已加载的 Drawable 设置为占位符,如下所示:

    private Drawable placeholder = ContextCompat.getDrawable(ctx, R.drawable.placeholder);

    public void loadImage(String url, ImageView imageView) 
        Glide.with(imageView.getContext())
            .load(url)
            .placeholder(placeholder)
            .into(new GlideDrawableImageViewTarget(imageView) 
                @Override
                public void onResourceReady(GlideDrawable drawable, GlideAnimation anim) 
                    super.onResourceReady(drawable, anim);
                    placeholder = drawable;
                
            );
    

【讨论】:

以上是关于使用 Glide 刷新 ImageView的主要内容,如果未能解决你的问题,请参考以下文章

Glide 加载圆角图片,解决多次刷新周围出现黑边问题

Glide 加载刷新闪动,自定义Transformations 必须实现的方法

Glide 加载刷新闪动,自定义Transformations 必须实现的方法

手机影音第十三天,xutils3Glide的使用获取网络图片;下拉上滑刷新;缓存网络资源

Glide使用和图片变形问题

Glide使用和图片变形问题