Does Android maintain a memory cache of application drawable resources and reuse them, or it is a good practice to preload all drawables that may be assigned dynamically to different widgets?
For instance:
public static final int[] SETS = {
R.drawable.set0, R.drawable.set1, R.drawable.set2,
R.drawable.set3, R.drawable.set4, R.drawable.set5, R.drawable.set6,
R.drawable.set7, R.drawable.set8, R.drawable.set9, R.drawable.set10};
public Drawable[] sets;
void init() {
load(sets, SETS);
}
public void load(Drawable[] d, int[] ids) {
for (int i = 0; i < ids.length; i++) {
if (ids[i] == 0)
d[i] = null;
else
d[i] = context.getResources().getDrawable(ids[i]);
}
}
This smells like an unnecessary pre-optimization. However, android does cache drawables so you don't have to pre-load them. Relevant code from ApplicationContext
/*package*/ Drawable loadDrawable(TypedValue value, int id)
throws NotFoundException {
.
.
.
final long key = (((long) value.assetCookie) << 32) | value.data;
Drawable dr = getCachedDrawable(key);
if (dr != null) {
return dr;
}
.
.
.
if (dr != null) {
dr.setChangingConfigurations(value.changingConfigurations);
cs = dr.getConstantState();
if (cs != null) {
if (mPreloading) {
sPreloadedDrawables.put(key, cs);
} else {
synchronized (mTmpValue) {
//Log.i(TAG, "Saving cached drawable @ #" +
// Integer.toHexString(key.intValue())
// + " in " + this + ": " + cs);
mDrawableCache.put(key, new WeakReference<Drawable.ConstantState>(cs));
}
}
}
}
return dr;
}
private Drawable getCachedDrawable(long key) {
synchronized (mTmpValue) {
WeakReference<Drawable.ConstantState> wr = mDrawableCache.get(key);
if (wr != null) { // we have the key
Drawable.ConstantState entry = wr.get();
if (entry != null) {
//Log.i(TAG, "Returning cached drawable @ #" +
// Integer.toHexString(((Integer)key).intValue())
// + " in " + this + ": " + entry);
return entry.newDrawable(this);
}
else { // our entry has been purged
mDrawableCache.delete(key);
}
}
}
return null;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With