Android Glide: как загружать и кэшировать растровые изображения?

Я использую 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 вообще не вызывается.

Ответ 1

Загрузка в 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, который будет обрабатывать размер и отмену для вас.

Ответ 2

Я использую 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)