package rabbitescape.ui.android;
import android.content.res.Resources;
import rabbitescape.render.BitmapCache;
/**
* I feel dirty, but I don't know how to ensure we
* don't leak Bitmaps if we make a new cache for every
* GameActivity. If I clean up in onPause I get errors
* because some of the Bitmaps I am recycling are still
* being used in another thread.
*
* So, a singleton that is also stateful because we
* update the loader because we get a new Resources
* instance, just in case old ones become invalid.
*
* Please, tell me how to do this better.
*/
public class SingletonBitmapCache
{
private static BitmapCache<AndroidBitmap> theInstance;
public static synchronized BitmapCache<AndroidBitmap> instance(
Resources resources )
{
if ( theInstance == null )
{
theInstance = new BitmapCache<AndroidBitmap>(
new AndroidBitmapLoader( resources ),
new AndroidBitmapScaler(),
cacheSize()
);
}
else
{
theInstance.setLoader( new AndroidBitmapLoader( resources ) );
}
return theInstance;
}
private static long cacheSize()
{
// About a quarter of our memory will go on bitmaps.
// When I set it to a third on my Samsung S3,
// I couldn't make it crash so I reduced the value
// for a bit of safety.
return Runtime.getRuntime().maxMemory() / 4;
}
/**
* Don't construct one of these.
*/
private SingletonBitmapCache()
{
}
}