【问题标题】:Assign ressource dynamically vs. big switch case动态分配资源与大开关案例
【发布时间】:2013-01-30 08:59:56
【问题描述】:

我对我的 Android 代码的性能和最佳方法有疑问。

我需要做的很简单,我想动态地将一个文本值分配给一个字符串资源,这取决于一个 int 参数:

现在我使用的是大开关盒

int messagesCategory;
if(extras !=null) {
        messagesCategory = extras.getInt("category");
    }

TextView titleText;
    titleText = (TextView) findViewById(R.id.headerTitle);

switch (messagesCategory) {
    case 1: titleText.setText(R.string.TitleMessageList1); break;
    case 2: titleText.setText(R.string.TitleMessageList2); break;
    case 3: titleText.setText(R.string.TitleMessageList3); break;
    case 4: titleText.setText(R.string.TitleMessageList4); break;

    case ...: titleText.setText(R.string.TitleMessageList...); break;

    case n: titleText.setText(R.string.TitleMessageListn); break;
    default: titleText.setText("a default title");  break;
    }

假设我在这个开关中有 30 行... 它有效,但在许多情况下,看起来有更好的方法来实现这一点。 不幸的是,看起来不可能为 R.string 分配一些动态的东西..

所以我的第一个问题是:1) 性能方面,在这种情况下,30 左右的情况下使用大开关是否有问题? 2) 最好的方法应该是什么?

谢谢,祝你有美好的一天

【问题讨论】:

  • 为什么不使用字符串数组资源?

标签: android performance switch-statement


【解决方案1】:

简单,

int[] stringIds = {R.string.TitleMessageList1, R.string.TitleMessageList2,...};

int messagesCategory;
TextView titleText = (TextView) findViewById(R.id.headerTitle);
    if(extras !=null) {
            messagesCategory = extras.getInt("category");
            if(messagesCategory  <= n)
            titleText.setText(stringIds[messagesCategory]);
            else  titleText.setText("a default title"); 
 }

现在,没有 switch-case 和比较,Basic Java 和 Android 基础使其变得简单而简短..

由于R.string.XXX 是在R.java 文件中生成的int value,您必须创建一个包含该值的int 数组,然后使用您的int messagesCategory 获取值。并直接设置为TextView..

【讨论】:

  • 感谢您的回答,但是在您的代码的第一行,看来我仍然需要手动输入 30 个 ID...无论如何要避免这种情况?
  • 是的,在您的应用程序包的array.xml 文件res/values 目录中创建一个字符串数组。现在您可以直接在代码中获取数组,使用getResource().getStringArray(&lt;array_name&gt;);
  • 欢迎好友..!乐于助人..!
  • 仍然不确定当您可以将 R.string.whatever 整数与 Intent 一起传递时,数组有什么用处,正如我在回答中所建议的那样。 ;)
【解决方案2】:

您也可以这样做:

Field f = R.id.class.getField("TitleMessageList" + String.valueOf(messagesCategory));
int val = f.getInt(null);
titleText.setText(val);

速度很快,无需在内存中加载所有id。

享受吧!

【讨论】:

    【解决方案3】:

    switch case 相当于代码中的GOTO,无需担心性能问题。

    你的代码很好,可能不是很好,但它可以工作而且很高效。

    【讨论】:

      【解决方案4】:
      1. 我认为 30 个 case 语句不会造成太大伤害,除非您在循环中执行它们、遍历数组等。

      2. 你为什么不直接使用 R.string 给你的整数呢?映射真的有必要吗?您可以传递 R.string 标识符。否则,如果您真的担心性能,可以在数组中查找。

      【讨论】:

        猜你喜欢
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 2016-10-09
        • 2020-11-15
        • 1970-01-01
        相关资源
        最近更新 更多