package fr.moreaubenjamin.imageloader; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import android.content.Context; import android.graphics.Bitmap; import android.util.Log; import com.wb.sc.R; import fr.moreaubenjamin.imageloader.settings.ImageLoaderSettings; public class MemoryCache { private Map<String, Bitmap> mCache = Collections.synchronizedMap(new LinkedHashMap<String, Bitmap> (10, 1.5f, true)); private long mSize = 0; private long mLimit = 1000000; private Context mContext; public MemoryCache(Context context) { mContext = context; setLimit(Runtime.getRuntime().maxMemory() / 4); } private void setLimit(long newLimit) { mLimit = newLimit; // Log.i(ImageLoaderSettings.MEMORY_CACHE_TAG, mContext.getString(R.string.memory_cache_set_limit, mLimit / 1024. / 1024.)); } public Bitmap get(String id) { try { if (!mCache.containsKey(id)) { return null; } return mCache.get(id); } catch (NullPointerException ex) { ex.printStackTrace(); return null; } } public void put(String id, Bitmap bitmap) { try { if (mCache.containsKey(id)) { mSize -= getSizeInBytes(mCache.get(id)); } mCache.put(id, bitmap); mSize += getSizeInBytes(bitmap); checkSize(); } catch (Throwable ex) { ex.printStackTrace(); } } private void checkSize() { // Log.i(ImageLoaderSettings.MEMORY_CACHE_TAG, mContext.getString(R.string.memory_cache_check_size_start, mSize, mCache.size())); if (mSize > mLimit) { Iterator<Map.Entry<String, Bitmap>> iterator = mCache.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Bitmap> entry = iterator.next(); mSize -= getSizeInBytes(entry.getValue()); iterator.remove(); if (mSize <= mLimit) { break; } } // Log.i(ImageLoaderSettings.MEMORY_CACHE_TAG, mContext.getString(R.string.memory_cache_check_size_end, mCache.size())); } } private long getSizeInBytes(Bitmap bitmap) { return (bitmap == null) ? 0 : (bitmap.getRowBytes() * bitmap.getHeight()); } public void clear() { try { mCache.clear(); mSize = 0; } catch (NullPointerException ex) { ex.printStackTrace(); } } }