【问题标题】:Android: Creating custom class of resourcesAndroid:创建自定义资源类
【发布时间】:2010-04-01 22:14:12
【问题描述】:

Android 上的 R 类有其局限性。您不能动态地使用资源来加载音频、图片或其他任何内容。例如,如果您不想为所选对象加载一组音频文件,则不能执行以下操作:

R.raw."string-upon-choosen-object"

我是 android 新手,至少我没有找到如何做到这一点,这取决于选择的对象或比这更动态的东西。所以,我想用一点内存开销让它动态化。但是,我怀疑这是否值得,或者只是与外部资源不同。

想法是这样的:

修改ant build xml来执行我自己的任务。此任务是一个 java 程序,它解析 R.java 文件,并使用它的对(键,值)构建一组 HashMap。我已经手动完成了,效果很好。所以我需要一些专家的声音。

这就是我将如何管理整个事情的方式:

生成一个基类Application,例如MainApplicationResources 构建了所有需要的方法和属性。然后,您可以访问那些调用getApplication() 的方法,然后访问所需的方法。

类似这样的:

  package [packageName]

  import android.app.Application;

  import java.util.HashMap;

  public class MainActivityResources extends Application {

      private HashMap<String,Integer> [resNameObj1];
      private HashMap<String,Integer> [resNameObj2];
      ...
      private HashMap<String,Integer> [resNameObjN];

      public MainActivityResources() {
          super();

      [resNameObj1] = new HashMap<String,Integer>();
      [resNameObj1].put("[resNameObj1_Key1]", new Integer([resNameObj1_Value1]));
      [resNameObj1].put("[resNameObj1_Key2]", new Integer([resNameObj1_Value2]));

      [resNameObj2] = new HashMap<String,Integer>();
      [resNameObj2].put("[resNameObj2_Key1]", new Integer([resNameObj2_Value1]));
      [resNameObj2].put("[resNameObj2_Key2]", new Integer([resNameObj2_Value2]));
      ...
      [resNameObjN] = new HashMap<String,Integer>();
      [resNameObjN].put("[resNameObjN_Key1]", new Integer([resNameObjN_Value1]));
      [resNameObjN].put("[resNameObjN_Key2]", new Integer([resNameObjN_Value2]));
      }

      public int get[ResNameObj1](String resourceName) {
          return [resNameObj1].get(resourceName).intValue();
      }

      public int get[ResNameObj2](String resourceName) {
          return [resNameObj2].get(resourceName).intValue();
      }

      ...

      public int get[ResNameObjN](String resourceName) {
          return [resNameObjN].get(resourceName).intValue();
      }
}

问题是:

我会增加设备的过多内存使用吗?值得吗?

问候,

【问题讨论】:

    标签: android


    【解决方案1】:

    我是 android 新手,至少我是 没有找到你怎么能做到这一点, 取决于选择的对象 或者比这更有活力的东西。

    Resources 类有一个getIdentifier() 方法,该方法会以字符串形式为您提供资源ID。这使用反射,因此您可能希望缓存结果,可能使用 LinkedHashMap 作为 LRU 缓存。

    值得吗?

    恕我直言,不是真的。我只会使用getIdentifer() 或自己直接使用反射。事实上,我自己已经直接使用反射(使用 LRU 缓存)来解决这个问题。

    【讨论】:

    • 我明白了,由于某种原因,我丢失了 getIdentifier() 部分阅读文档。但是,如果我缓存结果,在启动时预缓存所有资源不是更好吗?我知道这可能会消耗太多内存,但我不知道有多少。也许一个小百分比的数字会帮助我努力。
    • “但是,如果我缓存结果,在开始时预缓存所有资源不是更好吗?”不,对于大多数应用程序。您通过预缓存所做的只是延迟应用程序的启动(用户可能会感觉到),以消除应用程序使用时的一系列微小延迟。某些应用程序,例如实时游戏,可能对速度非常敏感,以至于用户会察觉到这些延迟,因此预先缓存可能会很好。然而,大多数应用程序都不是实时游戏,而且即时查找的成本会被其他事情(例如数据库 I/O)淹没。只有在科学证明您需要时才进行预缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2022-10-04
    • 2016-06-14
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多