在android中作为类字段保持对Resources对象的引用是否可以?

时间:2013-11-13 14:33:18

标签: android

是否可以拥有这样的类字段:

private Resources resources;

并在构造函数中设置它:

resources = myViewGroup.getContext().getResources();

我从未见过这样的参考,所以我担心这里有危险。

2 个答案:

答案 0 :(得分:1)

代码没有任何问题。

潜在的危险是它会指向错误的资源或导致内存泄漏。

配置更改时,例如由于屏幕旋转,默认情况下Android会破坏您的活动并使用更新的配置特定资源重新创建它。

由于您将它作为常规成员变量而不是静态类变量,因此只有在对象本身处于活动状态时才会保留引用。没有泄漏,因为您在构造函数中更新引用,它也将指向正确的资源变体。

如果您在清单中使用configChanges实现了自定义配置更改处理,则默认的销毁和重新创建配置更改处理不适用。在这些情况下,您可能会意外地保留对旧Resources对象的引用。

答案 1 :(得分:1)

这并不危险,但似乎不是很优雅;

来自docs:

 The Android SDK tools compile your application's resources into the application binary at build time. 

这意味着它们不会在运行时更改,因此您保留的对它们的任何引用都将始终是最新的。由于同样的原因,Law of Demeter我不建议将引用传递给Resources,而是将其提升到某个高级别(您可以访问Context,例如。Activity)并将值传递给StringDrawablefloat等函数。