10

我正在使用 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根本没有被调用。

4

3 回答 3

15

在调用into之前,Glide 中的加载不会开始。RequestListener 接口观察请求,但通常不用于处理结果。考虑让您的回调实现Target接口并将其传递给 using into,而不是使用 RequestListener 。

或者,您可以扩展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,并将视图传递给它将为您处理大小和取消的视图。

于 2014-12-26T17:13:02.143 回答
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);
于 2016-09-01T08:05:02.117 回答
3

现在在 Glide 4.9.0 上更加简单。

Glide.with(this)
    .downloadOnly()
    .load(url)
于 2019-05-27T22:58:35.277 回答