package com.aviary.android.feather.utils; import java.lang.ref.SoftReference; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.concurrent.ConcurrentHashMap; import android.graphics.Bitmap; import android.os.Handler; public class SimpleBitmapCache { private static final int DELAY_BEFORE_PURGE = 30 * 1000; private static final int HARD_CACHE_CAPACITY = 4; private final Handler purgeHandler = new Handler(); private final HashMap<String, Bitmap> sHardBitmapCache = new LinkedHashMap<String, Bitmap>( HARD_CACHE_CAPACITY / 2, 0.75f, true ) { private static final long serialVersionUID = 7320831300767054723L; @Override protected boolean removeEldestEntry( LinkedHashMap.Entry<String, Bitmap> eldest ) { if ( size() > HARD_CACHE_CAPACITY ) { sSoftBitmapCache.put( eldest.getKey(), new SoftReference<Bitmap>( eldest.getValue() ) ); return true; } else return false; } }; private final static ConcurrentHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache = new ConcurrentHashMap<String, SoftReference<Bitmap>>( HARD_CACHE_CAPACITY / 2 ); public SimpleBitmapCache() {} public Bitmap getBitmapFromCache( String url ) { synchronized ( sHardBitmapCache ) { final Bitmap bitmap = sHardBitmapCache.get( url ); if ( bitmap != null ) { sHardBitmapCache.remove( url ); sHardBitmapCache.put( url, bitmap ); return bitmap; } } SoftReference<Bitmap> bitmapReference = sSoftBitmapCache.get( url ); if ( bitmapReference != null ) { final Bitmap bitmap = bitmapReference.get(); if ( bitmap != null ) { return bitmap; } else { sSoftBitmapCache.remove( url ); } } return null; } public void addBitmapToCache( String url, Bitmap bitmap ) { if ( bitmap != null ) { synchronized ( sHardBitmapCache ) { sHardBitmapCache.put( url, bitmap ); } } } public void clearCache() { sHardBitmapCache.clear(); sSoftBitmapCache.clear(); } public void resetPurgeTimer() { purgeHandler.removeCallbacks( mPurger ); purgeHandler.postDelayed( mPurger, DELAY_BEFORE_PURGE ); } private final Runnable mPurger = new Runnable() { @Override public void run() { clearCache(); } }; }