连续多次调用getDrawable,Drawable是否会被缓存优化?
关于多次调用getDrawable vs 存储为lazy val的分析
核心结论
- 多次调用
getDrawable可行,但并非所有场景都高效; - 用
lazy val缓存Drawable实例,在重复使用场景下更推荐,能避免不必要的资源开销。
1. 多次调用getDrawable的可行性
Android的Context.getDrawable()(或Resources.getDrawable())每次调用都会返回新的Drawable实例(系统内部对部分资源可能有缓存优化,但不同版本、资源类型存在差异)。多次调用本身不会引发崩溃或功能异常,但要注意:
- 频繁创建新实例会额外消耗内存,增加GC压力;
- 若需要对Drawable做状态修改(比如设置颜色滤镜、调整尺寸),多次调用生成的独立实例不会互相影响——这既是特性,也可能带来不必要的资源浪费,取决于你的需求。
2. 用lazy val缓存的优势
在需要重复使用同一个Drawable的场景下,将实例存在lazy val里是更优选择:
- 降低内存消耗:仅初始化一次实例,避免重复加载资源;
- 状态统一可控:如果后续需要修改Drawable属性,所有使用该实例的地方都会同步生效(若这是你需要的效果);
- 性能更稳定:省去频繁调用资源加载方法带来的微小性能损耗。
3. 场景选择建议
- 若只是单次使用,或每次需要独立状态的Drawable实例(比如不同View需同一张图的不同状态),直接调用
getDrawable即可; - 若同一个Drawable要在多场景重复使用,且无需独立状态,优先用
lazy val缓存。
Kotlin代码示例:
// 首次使用时初始化,后续直接复用缓存实例 private val myDrawable by lazy { context.getDrawable(R.drawable.ic_example) } // 复用缓存的Drawable button1.setImageDrawable(myDrawable) button2.setImageDrawable(myDrawable)
内容的提问来源于stack exchange,提问作者user1743524
相关产品推荐
相关产品推荐

