You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

连续多次调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:59:53