2014-12-24 61 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

嘗試參照該:[鏈接](http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html)。 –

回答

14

直到撥打電話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()'。 –

5

我用滑翔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);