使用Glide刷新ImageView

Tom*_*mas 5 android refresh imageview android-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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

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

Teo*_*ald 4

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

    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;
Run Code Online (Sandbox Code Playgroud)

  • 注意:IIRC 未处理一种情况:小部件的 onStop / onStart 当设备从睡眠状态恢复时会导致崩溃。不过修补应该很容易。我计划在 glide 4 发布时写一个更好的版本 (2认同)