2017-02-22 41 views
0

我想了解Volley的圖像緩存。我有一個網絡圖像視圖的片段,它將從服務器加載圖像。我無法使用NetworkImageView顯示圖像,當我嘗試加載圖像時什麼也沒有顯示出來。我閱讀Volley會自動處理圖像緩存。但我想我可能沒有使用正確的方式從服務器加載圖像。Volley Image Cahing

下面是我的代碼:

排球的Singleton

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

我在我的片段初始化網絡圖像視圖:

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

我H大家閱讀了很多文章和官方谷歌文檔,但我不明白它將如何工作在我的情況。

在此先感謝

+0

您缺少'imageLoader.get()'調用。 – Abbas

+0

你能指定嗎? –

+1

我強烈建議使用一些現有的圖像加載和緩存庫,如畢加索或Fresco。當你有選擇使用一些被主動維護和優化的東西時,自己實現這些東西沒有任何意義,並且在幾行代碼中執行相同的事情。 – Juuso

回答

1

你缺少GET呼籲ImageLoader。您也可能想要在響應回調中設置圖像。

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