2014-12-24 18 views
9

Sto usando Glide per scaricare e memorizzare immagini su Android. Tutto funziona bene, tranne il fatto che non voglio caricare le bitmap direttamente nel ImageView, non voglio avere l'animazione di dissolvenza, né i segnaposti delle immagini.Android Glide: come scaricare e memorizzare nella cache bitmap?

Tutto quello che voglio è creare un metodo globale che mi aiuti a scaricare l'immagine su tutta l'applicazione.

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); 
    } 

} 

Il problema è che non so come implementare l'ascoltatore. RequestListener non viene chiamato affatto.

+0

Prova riferimento a questo: [link] (http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html). –

risposta

14

I carichi in Glide non si avviano finché non si effettua una chiamata a into. L'interfaccia RequestListener osserva le richieste, ma in genere non è destinata alla gestione dei risultati. Invece di usare RequestListener, considera la tua callback implementare l'interfaccia Target e passarla usando into.

In alternativa si può solo estendere SimpleTarget e passarlo a ogni richiesta nello stesso modo in cui si sta tentando di utilizzare 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); 

Si vuole fornire una larghezza ed un'altezza in modo che Glide può downsampling e trasformare le immagini in modo appropriato. Potresti anche eseguire dei problemi con la cancellazione se stai visualizzando questi Bitmap nelle viste, nel qual caso ti consigliamo vivamente di rendere la vista disponibile per la tua API di caricamento e di passare la vista a into che gestirà il dimensionamento e la cancellazione per te.

+1

Puoi anche chiamare 'preload()' invece di 'in()' se non hai bisogno dell'immagine immediatamente o se preferisci usare un 'RequestListener' per il callback. –

5

Io uso Glide 3.7.0 e scaricare le immagini in questo modo:
è importante notare - esegue asyncroniously

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

Quando ho bisogno di mostrare l'immagine nella cache, io uso lo stesso URL e DiskCacheStrategy.SOURCE:

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