2017-02-22 3 views
0

저는 Volley의 이미지 캐싱을 이해하려고합니다. 네트워크 이미지 뷰가있는 조각이 있는데, 서버에서 이미지를로드합니다. NetworkImageView를 사용하여 이미지를 표시 할 수 없습니다. 이미지를로드하려고 시도 할 때 아무것도 표시되지 않습니다. 나는 Volley가 자동으로 이미지 캐싱을 처리한다고 읽었습니다. 하지만 난 서버에서 이미지를로드하는 적절한 방법을 사용하지 않을 수 있습니다 생각합니다.Volley Image Cahing

 String url = "https://pixabay.com/en/youtube-laptop-notebook-online-1158693/"; 
     mImageView = ((NetworkImageView) mView.findViewById(R.id.imageView)); 
     ImageLoader imageLoader = Volley.getInstance(mContext).getImageLoader(); 
     mImageView.setImageUrl(url, imageLoader); 

LruCache 클래스

public class BitmapLruCache extends LruCache<String, Bitmap> 
     implements ImageLoader.ImageCache { 
    public BitmapLruCache() { 
     this(getDefaultLruCacheSize()); 
    } 

    public BitmapLruCache(int sizeInKiloBytes) { 
     super(sizeInKiloBytes); 
    } 

    @Override 
    protected int sizeOf(String key, Bitmap value) { 
     return value.getRowBytes() * value.getHeight()/1024; 
    } 

    @Override 
    public Bitmap getBitmap(String url) { 
     return get(url); 
    } 

    @Override 
    public void putBitmap(String url, Bitmap bitmap) { 
     put(url, bitmap); 
    } 

    public static int getDefaultLruCacheSize() { 
     final int maxMemory = 
       (int) (Runtime.getRuntime().maxMemory()/1024); 
     final int cacheSize = maxMemory/8; 

     return cacheSize; 
    } 
} 

I : 내 조각에서 네트워크 이미지보기를 초기화 한

public class Volley { 
    private static Volley mInstance; 
    private static Context mContext; 

    private RequestQueue mRequestQueue; 
    private ImageLoader mImageLoader; 

    private Volley(Context context) { 
     mContext = context; 
     mRequestQueue = getRequestQueue(); 
     ImageLoader.ImageCache imageCache = new BitmapLruCache(); 
//  ImageLoader imageLoader = new ImageLoader(Volley.newRequestQueue(context), imageCache); 
     mImageLoader = new ImageLoader(mRequestQueue, 
       new ImageLoader.ImageCache() { 
        private final LruCache<String, Bitmap> 
          cache = new LruCache<String, Bitmap>(20); 

        @Override 
        public Bitmap getBitmap(String url) { 
         return cache.get(url); 
        } 

        @Override 
        public void putBitmap(String url, Bitmap bitmap) { 
         cache.put(url, bitmap); 
        } 
       }); 
    } 

    public static synchronized Volley getInstance(Context context) { 
     if (mInstance == null) { 
      mInstance = new Volley(context); 
     } 

     return mInstance; 
    } 

    public RequestQueue getRequestQueue() { 
     if (mRequestQueue == null) { 
      // getApplicationContext() is key, it keeps you from leaking the 
      // Activity or BroadcastReceiver if someone passes one in. 
      mRequestQueue = com.android.volley.toolbox.Volley.newRequestQueue(mContext.getApplicationContext()); 
     } 

     return mRequestQueue; 
    } 

    public <T> void addToRequestQueue(Request<T> req) { 
     getRequestQueue().add(req); 
    } 

    public ImageLoader getImageLoader() { 
     return mImageLoader; 
    } 
} 

클래스

발리 싱글 : 아래

내 코드입니다 h 아베 기사 및 공식적인 구글 문서를 많이 읽고 있지만 내 경우에는 어떻게 작동하는지 이해가 안돼. 사전

+0

'imageLoader.get()'호출이 누락되었습니다. – Abbas

+0

지정할 수 있습니까? –

+1

피카소 (Picasso) 나 프레스코 (Fresco)와 같은 기존의 이미지로드 및 캐싱 라이브러리를 사용하는 것이 좋습니다. 능동적으로 유지 보수되고 최적화 된 것을 사용할 수있는 옵션이있을 때 이러한 것들을 구현하는 것은 중요하지 않으며 몇 줄의 코드에서 똑같은 일을합니다. – Juuso

답변

1

에서

덕분에 당신은 ImageLoader에 대한 GET 호출을 누락되었습니다. 또한 응답 호출에서 이미지를 설정할 수도 있습니다.

imageLoader.get(url, new ImageLoader.ImageListener() { 
    @Override 
    public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 
     mImageView.setImage(response.getBitmap()); 
    } 

    @Override 
    public void onErrorResponse(VolleyError error) { 

    } 
}); 

컴파일러에서 코드를 검사하지 않았으므로 코드에 오류가있을 수 있습니다. @Juuso Lappalainen의 코멘트 인 Picasso은 이미지로드 및 자동 캐싱을위한 매우 멋진 라이브러리입니다. 여기서는 캐시의 크기 만 지정하면됩니다. 이미지 로딩을 한 줄로 단순화 할 수 있습니다.

+0

감사합니다. 지금 일하고있다. –

+1

StackOverflow가 작동하는 방식을 알려 드리겠습니다. 질문을 한 사람이 대답을 한 것으로 표시하면 답변에서 문제가 해결되었음을 의미합니다. 답변이 마음에 들면 완전하고 간결하며 잘 설명 된 정보가 들어 있다고 생각하면 위로 - 그 대답을 전하십시오. 그래서 내 대답이 문제를 해결했다면 받아 들일 수있는 것으로 표시하십시오. – Abbas