2014-12-24 2 views
9

Я использую Glide для загрузки и кеширования изображений на Android. Все работает хорошо, за исключением того факта, что я не хочу загружать растровые изображения непосредственно в ImageView, я не хочу, чтобы анимация затухания не была, а также заполнители изображений.Android Glide: как загружать и кэшировать растровые изображения?

Все, что я хочу, это создать глобальный метод, который поможет мне загрузить изображение по всему приложению.

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 вообще не называется.

+0

Try со ссылкой на это: [ссылка] (http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html). –

ответ

14

Грузы в 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 может downsample и преобразовывать изображения соответствующим образом. Вы также можете столкнуться с проблемами с отменой, если вы показываете эти растровые изображения в представлениях, и в этом случае я настоятельно рекомендую сделать представление доступным для вашего API загрузки и передать представление into, которое будет обрабатывать размер и отмену для вас.

+1

Вы можете также вызвать 'preload()' вместо 'in()', если вам не нужно изображение сразу или если вы предпочитаете использовать 'RequestListener' для обратного вызова. –

5

Я использую Glide 3.7.0 и скачать изображения таким образом:
важно отметить - он выполняет asyncroniously

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); 
Смежные вопросы