Question

I am using LruCache to store Bitmaps.

Here is the async task I run to store the bitmap.

new AsyncTask<Void, Void, Bitmap>() {

        @Override
        protected Bitmap doInBackground(Void... args) {
            String url = d.getImageUrl();
            if (url != null && !url.equals("")) {
                try {
                    LogUtils.log("getting image from cache");
                    Bitmap image = imageCache.getBitmapFromMemCache(url);
                    if (image == null) {

                        image = BitmapFactory.decodeStream(new URL(url)
                                .openConnection().getInputStream());
                        LogUtils.log("storing image to cache");
                        imageCache.addBitmapToMemoryCache(url, image);
                    } else {
                        LogUtils.log("got image from cache");
                    }
                    return image;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;

        }

        @Override
        protected void onPostExecute(Bitmap image) {
            if (holder.image != null) {
                if (image != null) {
                    holder.image.setImageBitmap(image);
                    holder.image.setVisibility(View.VISIBLE);
                }   
            }

        }

    }.execute();

Here is my cache implementation:

public class ImageCache {

private static ImageCache instance;

public static ImageCache getInstance(Context context) {
    if (instance == null)
        instance = new ImageCache(context);
    return instance;
}

private LruCache<String, Bitmap> mMemoryCache;

private ImageCache(Context context) {
    // Get memory class of this device, exceeding this amount will throw an
    // OutOfMemory exception.
    final int memClass = ((ActivityManager) context
            .getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();

    final int cacheSize = (1024 * 1024 * memClass)/8;


    mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // The cache size will be measured in bytes rather than number
            // of items.
            return bitmap.getRowBytes() * bitmap.getHeight();
        }
    };
}

public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    LogUtils.log("key: " + key);
    if (getBitmapFromMemCache(key) == null) {
        mMemoryCache.put(key, bitmap);
    } 
}

public Bitmap getBitmapFromMemCache(String key) {
    return mMemoryCache.get(key);
}

}

In my manifest I also have:

android:largeheap="true"

THe problem is that in my ListView... when I scroll down.... the image reloads from the url and the code reaches this line:

LogUtils.log("storing image to cache");

What could be causing this problem?

Was it helpful?

Solution

Thanks to @Ascorbin I came to the answer! No need to reinvent the wheel. I used this library:

https://github.com/nostra13/Android-Universal-Image-Loader

If anyone has the same problem as me... That is... cached images getting reloaded from the interwebs.... Then use that library and this snippet to set your image:

        DisplayImageOptions options = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.noimage) // resource or drawable
        .showImageForEmptyUri(R.drawable.noimage) // resource or drawable
        .resetViewBeforeLoading(true)  
        .delayBeforeLoading(0)
        .cacheInMemory(true) 
        .cacheOnDisc(true) 
        .bitmapConfig(Bitmap.Config.ARGB_8888) 
        .build();


        String url = d.getImageUrl();
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(v.getContext())
                .defaultDisplayImageOptions(options)
                .build();
        ImageLoader imageLoader = ImageLoader.getInstance();
        imageLoader.init(config);
        imageLoader.displayImage("", holder.image);
        imageLoader.displayImage(url, holder.image);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top