如何优雅地检查原始资源是否不存在?

时间:2011-07-28 03:56:35

标签: java android io

我的课程中有一个名为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)。如果id不存在或无法打开,则看起来create不会抛出异常。所以我必须在通过之前检查一下吗?

如何优雅地处理这个?直到现在我才假设rId总是正确但我想检查以确保。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

我建议您使用我的方法获取资源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;

    }