【问题标题】:How to get resource without context in Android?如何在Android中获取没有上下文的资源?
【发布时间】:2020-01-16 13:28:57
【问题描述】:

如果我有不同的资源名称,例如大象、老虎和猫。我想创建一个接受资源名称并返回可绘制对象的方法。然后我写了这个

public Drawable getDrawable(String name){
int defaultResId=  ResourceOptimizer.getResId(name,R.drawable.class);
return getResources().getDrawable(defaultResId);
}

ResourceOptimizer

public class ResourceOptimizer {
public static int getResId(String resName, Class<?> c)         {
    try {
        Field idField = c.getDeclaredField(resName);
        return idField.getInt(idField);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    }
}
}

但问题是需要调用getResources() 在活动或片段中,否则您要传递上下文。

传递上下文可能会导致内存泄漏。特别是,当 它必须通过几个类。我想知道是否 有一些方法可以通过更方便的方式获取资源。 喜欢 R.id.DRAWABLE_NAME

【问题讨论】:

  • 从哪里调用getDrawable 方法?如果发布更多代码会更有帮助。
  • @KishoreJethava 在片段或活动之外。所以我需要多次传递上下文,因为我喜欢提取方法。

标签: android memory-leaks getresource


【解决方案1】:

ResourceOptimizer 是哪个

Resources 已经有一个getIdentifier() 方法。

但问题是 getResources() 需要在活动或片段中调用,否则你要传递上下文。

正确。资源只能通过合适的Context 获得。请注意,“合适”视情况而定;对于 UI,您几乎总是希望使用活动或片段中的 Context。例如,您可能需要根据设备在 Android 10+ 上是否处于黑暗模式而使用不同的可绘制对象。

传递上下文可能会导致内存泄漏

不使用您在此处的代码,因为您没有将Context 或其中的任何内容保存在一个可能比Context 本身寿命更长的字段中。

我想知道是否有某种方法可以通过更方便的方式获取资源。比如 R.id.DRAWABLE_NAME

getDrawable()Context 上的一个方法。所以,请致电getDrawable(R.drawable.elephant)

您的代码正在尝试避免使用R.drawable,而不是使用String 名称。所以,这就变成了:

getDrawable(getResources().getIdentifier(yourString, "drawable", getPackageName()))

其中yourString 是您的资源的字符串基本名称(例如,"elephant")。

理想情况下,如果您希望在进程的生命周期内多次通过此代码检索相同的资源,您应该缓存 getIdentifier() 返回的值。反射并不便宜。

【讨论】:

  • 所以当我需要drawable 资源时,我仍然无法避免调用getResource()。如果我避免save 上下文状态,例如使用静态变量指向上下文,它是否安全?在什么情况下我还应该避免传递上下文以避免内存泄漏?谢谢。
  • @Alston:您要确保使用 Context 的任何内容都不会超过 Context。在 UI 的情况下,您要确保使用 Activity 的任何东西都不会比 Activity 寿命长,或者是非常精心构造以确保它不会泄漏任何东西。 static 字段的寿命会比 Context 长,这就是为什么我们经常用它作为不该做的例子。
  • @CommonsWare 那么,这不可能吗?我有用户自定义的图标。它们总是需要相同。所以它们实际上并不依赖于上下文。我希望通过存储库访问它们。所以我可以通过依赖注入来访问它们。关于我应该如何进行的任何想法?
  • @Lawnio:“我有用户自定义的图标”——那么它们就不是资源。资源是这个问题和这个答案的主题。 “关于我应该如何进行的任何想法?” -- 我建议你阅读this section of the documentationthis blog post series。如果您还有其他问题,我建议您单独提出 Stack Overflow 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2011-07-31
相关资源
最近更新 更多