Android的滑翔:如何下载和caching位图?

我正在使用Glide在Android上下载和caching图像。 一切运作良好,除了我不想将位图直接加载到ImageView ,我不想要淡入淡出的animation,也没有图像占位符。

我想要的只是创build一个全局的方法,这将帮助我下载整个应用程序的形象。

 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根本不被调用。

Solutions Collecting From Web of "Android的滑翔:如何下载和caching位图?"

在您拨打电话之前,Glide中的负载不会启动。 RequestListener接口观察请求,但通常不用于处理结果。 而不是使用RequestListener,考虑让你的callback实现目标接口,并将其传入 。

或者,您可以只扩展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可以适当降低采样和转换图像。 如果您在视图中显示这些位图,您也可能会遇到取消问题,在这种情况下,我强烈build议您将视图提供给您的加载API,并将视图传递给您,以便处理大小和取消。

我使用Glide 3.7.0并以这种方式下载图像:
重要的是要注意 – 它执行exception

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

当我需要显示caching的图像时,我使用相同的URL和DiskCacheStrategy.SOURCE

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