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)