The code below is useful if you need to cache images in Android. Weak references are used to help protect against memory leaks.
Drawable Cache Class:
public class DrawableCache
{
public Context Context { get; set; }
Dictionary<object, WeakReference<Drawable.ConstantState>> _cache = new Dictionary<object, WeakReference<Drawable.ConstantState>>();
public DrawableCache(Context context)
{
Context = context;
}
public void Put(object key, Drawable drawable)
{
_cache[key] = new WeakReference<Drawable.ConstantState>(drawable.GetConstantState(), false);
}
public Drawable Get(object key)
{
WeakReference<Drawable.ConstantState> value;
if (_cache.TryGetValue(key, out value))
{
Drawable.ConstantState target;
if (value.TryGetTarget(out target))
{
return target.NewDrawable(Context.Resources);
}
_cache.Remove(key);
}
return null;
}
}
Optional Drawable Cache Key class
public class DrawableCacheKey
{
public int Key { get; set; }
public int Flags { get; set; }
public DrawableCacheKey(int key, int flags)
{
Key = key;
Flags = flags;
}
public override int GetHashCode()
{
int hash = 17;
hash = hash * 23 + Key.GetHashCode();
hash = hash * 23 + Flags.GetHashCode();
return hash;
}
public override bool Equals(object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
var cast = obj as DrawableCacheKey;
return cast != null && Key == cast.Key && Flags == cast.Flags;
}
}
No comments:
Post a Comment