【问题标题】:How to gracefully check if a raw resource doesn't exist?如何优雅地检查原始资源是否不存在?
【发布时间】:2011-10-14 19:11:16
【问题描述】:

我的班级中有一个名为 play 的方法,我想要播放音频文件。播放哪个文件取决于类当前的 audioIndex 值。基本上,有一个这样的开关:

int rId; 
switch (audioIndex){
  case 0: rId = R.raw.e0.wav; break;
  case 1: rId = R.raw.e1.wav; break;
  default: rId = R.raw.error.wav; break;
}

切换后,我想在将 rId 传递给 MediaPlayer.create(this, rId) 之前验证 rId 是否有效。如果 id 不存在或无法打开,则 create 似乎不会引发异常。所以我必须在通过之前检查?

如何优雅地处理这个问题?到目前为止,我只是假设 rId 始终是正确的,但我想检查以确保。

【问题讨论】:

  • R.raw.* 文件怎么可能不存在?它们被编译到你的包中,一定是添加了它们......当然,它们可能是无效的,但你为什么要这样做?
  • 确实如此,但安全总比后悔好?
  • 嗯...你应该坚持你的假设,它永远是正确的。
  • 嗯,我当然是这个假设的粉丝。 :)
  • @dmon 好几年了……但是如果你有一个文件夹raw-land 用于横向模式,那么其中的一些资源在纵向模式下将不可用。

标签: java android io


【解决方案1】:

我建议您使用我的方法来获取资源 ID。如果您在那里进行简单的异常处理,您将看到,如果您的资源不存在,它将被抛出。这将优雅地解决您的问题。

代码如下:

/**
     * @author Lonkly
     * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
     * @param с - class of resource, e.g R.drawable, of R.raw
     * @return integer id of resource
     */
    public static int getResId(String variableName, Class<?> с) {

        Field field = null;
        int resId = 0;
        try {
            field = с.getField(variableName);
            try {
                resId = field.getInt(null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resId;

    }

【讨论】:

    【解决方案2】:

    您可以使用this method 从文件名中获取资源标识符。如果它不是有效的资源 ID,它将返回 0。请参阅this question 了解更多信息。

    如果资源不存在,则项目不应该编译,因为 R.resourcetype.resourcename 在 R.java 中不存在。这仅在您不知道运行时将拥有哪些资源时才有用。

    【讨论】:

      猜你喜欢
      • 2013-09-07
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多