2014-12-24 8 views
9

Używam Glide do pobierania i buforowania obrazów na Androidzie. Wszystko działa dobrze, oprócz tego, że nie chcę ładować bitmap bezpośrednio do ImageView, nie chcę mieć animacji zaniku, ani symboli zastępczych obrazu.Android Glide: jak pobierać i zapisywać mapy bitowe w pamięci podręcznej?

Wszystko czego chcę, to stworzyć globalną metodę, która pomoże mi pobrać obraz całej aplikacji.

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

} 

Problem polega na tym, że nie wiem, jak zaimplementować słuchacza. RequestListener nie jest w ogóle wywoływany.

+0

Spróbuj odnosi się do tego: [LINK] (http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html). –

Odpowiedz

14

Obciążenia poślizgowe nie rozpoczynają się przed wykonaniem połączenia z into. Interfejs RequestListener śledzi żądania, ale zazwyczaj nie jest przeznaczony do obsługi wyników. Zamiast używać RequestListener, rozważ posiadanie swojego wywołania zwrotnego zaimplementuj interfejs Target i przekaż go używając into.

Alternatywnie można po prostu rozszerzyć SimpleTarget i przekazać je na każde żądanie w taki sam sposób starasz się używać 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); 

Będziemy chcieli, aby zapewnić szerokość i wysokość, tak aby można Glide odpowiednio analizować i przekształcać obrazy. Możesz również spotkać się z problemami z anulowaniem, jeśli wyświetlasz te bitmapy w widokach, w takim przypadku zdecydowanie zaleciłbym udostępnienie widoku dla twojego ładującego się interfejsu API i przekazanie widoku do into, która zajmie się twoimi rozmiarami i anulowaniem.

+1

Możesz także wywołać 'preload()' zamiast 'into()', jeśli nie potrzebujesz natychmiastowego obrazu lub wolisz użyć 'RequestListener' do wywołania zwrotnego. –

5

używam Glide 3.7.0 i pobrać obrazy w ten sposób:
ważne jest, aby pamiętać - to wykonuje asyncroniously

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

Kiedy trzeba pokazać obraz z pamięci podręcznej, używam tej samej zawartości i DiskCacheStrategy.SOURCE:

Glide.with(this) 
    .load(url) 
    .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
    .into(imageView); 
Powiązane problemy