2014-12-24 39 views
9

글라이드를 사용하여 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을 호출 할 때까지 글라이드의로드가 시작되지 않습니다. 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'를 사용하려는 경우'into()'대신'preload()'를 호출 할 수도 있습니다. –

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을 사용하여 DiskCacheStrategy.SOURCE이 참조

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