1

我对我的 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)什么应该是最好的方法?

谢谢,祝你有美好的一天

4

4 回答 4

5

简单的,

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.XXXint value生成的,R.java您必须创建一个包含该值的 int 数组,然后使用您的int messagesCategory. 并直接设置为TextView..

于 2013-01-30T09:02:38.123 回答
1

你也可以这样做:

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

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

享受!

于 2013-01-30T09:37:00.167 回答
0

switch case 相当于GOTO您的代码中的,并且无需担心性能。

您的代码很好,可能不太好,但它有效且高效。

于 2013-01-30T09:02:02.123 回答
0
  1. 我不认为 30case条语句不会造成太大伤害,除非你在循环中执行它们、遍历数组等等。

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

于 2013-01-30T09:03:50.950 回答