Android Glide:如何下载和缓存位图?

问题描述:

我正在使用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

尝试参照该:[链接](http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html)。 –

直到拨打电话into才开始载入Glide。 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); 

您将要提供的宽度和高度,以便能够滑翔适当地下采样和转换图像。如果您在视图中显示这些位图,也可能遇到取消问题,在这种情况下,我强烈建议将视图提供给您的加载API,并将视图传递给into,以便您处理大小和取消。

+1

如果您不需要立即映像,或者您更愿意使用RequestListener作为回调函数,那么也可以调用'preload()'而不是'into()'。 –

我用滑翔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和​​:

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