通过梳理下ImageView的setImageResource方法的调用流程,来看下android中Resources的资源缓存机制。
public void setImageResource(int resId) {
// The resource configuration may have changed, so we should always
// try to load the resource even if the resId hasn't changed.
final int oldWidth = mDrawableWidth;
final int oldHeight = mDrawableHeight;
updateDrawable(null);
mResource = resId;
mUri = null;
resolveUri();
if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
requestLayout();
}
invalidate();
}
先调用updateDrawable将mDrawable置为null,然后调用resolveUri方法。
private void resolveUri() {
... ...
if (mResource != 0) {
try {
d = mContext.getDrawable(mResource);
} catch (Exception e) {
Log.w("ImageView", "Unable to find resource: " + mResource, e);
// Don't try again.
mUri = null;
}
} else if (mUri != null) {
... ...
} else {
... ...
} else {
return;
}
updateDrawable(d);
}
resolveUri中会调用Context的getDrawable方法。