Android Glide:如何下载和缓存位图?

11

我正在使用Glide在Android上下载和缓存图像。除了我不想直接将位图加载到ImageView中,也不想有淡入动画和图像占位符外,一切都运行良好。

我想要的是创建一个全局方法,可以帮助我在应用程序中随处下载图像。

public class MyApp extends Application {

   public static void downloadImage(String url, final OnImageLoadedCallback callback) {

     // And how to implement the listener ?

     RequestListener<String, Bitmap> requestListener = new RequestListener<String, Bitmap() {
        @Override
        public boolean onException(Exception exc, String string, Target<Bitmap> target, boolean isFirstResource) {

           callback.onDone(null);               

           return false;
        }

        @Override
        public boolean onResourceReady(Bitmap bitmap, String string, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {

            callback.onDone(bitmap);

            return false;
        }
     };

      Glide.with(context)
           .load(url)
           .asBitmap()
           .dontAnimate()
           .diskCacheStrategy(DiskCacheStrategy.SOURCE)
           .listener(requestListener);
   }

}

问题在于我不知道如何实现监听器。RequestListener根本没有被调用。


请参考此链接:linK - Sahil Lombar
3个回答

15
Glide中的加载直到调用into才会开始。RequestListener接口用于观察请求,但通常不用于处理结果。除了使用RequestListener外,还可以让回调实现Target接口并通过into进行传递。
或者,您可以扩展SimpleTarget,并以与尝试使用RequestListener相同的方式将其传递给每个请求:
Target target = Glide.with(context)
     ...
     .into(new SimpleTarget<Bitmap>(width, height) {
          @Override
          public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
              callback.onDone(resource);
          }

          @Override
          public void onLoadFailed(Exception e, Drawable errorDrawable) {
              callback.onDone(null);
          }
     });

// At some point later, if you want to cancel the load:
Glide.clear(target);

您需要提供宽度和高度,以便Glide可以适当地缩小和转换图像。如果您在视图中显示这些位图,则可能会遇到取消问题,此时我强烈建议将视图提供给您的加载API,并将视图传递给into,它将为您处理大小和取消。


1
如果您不需要立即加载图像或者更喜欢使用 RequestListener 进行回调,您也可以调用 preload() 而不是 into() - Jarett Millard

7

我使用Glide 3.7.0来下载图片,方式如下:
需要注意的是 - 它会异步执行

Glide.with(this)
    .load(url)
    .downloadOnly(new SimpleTarget<File>() {
        @Override
        public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) {
            LOGGER.debug("Photo downloaded");
        }
    });

当我需要显示缓存的图片时,我使用相同的URL和DiskCacheStrategy.SOURCE

Glide.with(this)
    .load(url)
    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
    .into(imageView);

3
在Glide 4.9.0中,现在更加简单易用。
Glide.with(this)
    .downloadOnly()
    .load(url)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接