这篇小文主要是介绍图片资源的处理,其他类型资源 读取大同小异。
这部分的源码各版本之间略有不同,但获取图片资源整体流程相似。首先获取TypedValue属性加锁保护起来了,应该是支持异步调用(有待研究)。主要区分colordrawable和其他类型drawable。系统进程读取的资源缓存策略也不一样,跟着源码走走,脉络还是很清晰。
@Nullable
public Drawable getDrawable(@DrawableRes int id, @Nullable Theme theme) throws NotFoundException {
TypedValue value;
synchronized (mAccessLock) {
value = mTmpValue;
if (value == null) {
value = new TypedValue();
} else {
mTmpValue = null;
}
//获得该资源ID所对应的资源值,并且保存在类型为TypedValue的变量value
getValue(id, value, true);
}
final Drawable res = loadDrawable(value, id, theme);
synchronized (mAccessLock) {
if (mTmpValue == null) {
mTmpValue = value;
}
}
return res;
}
@Nullable
Drawable loadDrawable(TypedValue value, int id, Theme theme) throws NotFoundException {
if (TRACE_FOR_PRELOAD) {
// Log only framework resources
//id小于0x1000 0000时表示访问系统资源
if ((id >>> 24) == 0x1) {
final String name = getResourceName(id);
if (name != null) {
Log.d("PreloadDrawable", name);
}
}
}
final boolean isColorDrawable;
final DrawableCache caches;
final long key;
if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT
&& value.type <= TypedValue.TYPE_LAST_COLOR_INT) {
isColorDrawable = true;
caches = mColorDrawableCache;
key = va