使用 Glide 刷新 ImageView

ImageView refresh with Glide

我有一个 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);
        }
    });

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

问题

Is possible keep the image in ImageView and replace it after new image is downloaded?

这是预期的行为。
每次调用 .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;

你可以在下次加载时将已加载的 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;
                }
            });
    }