动态分配ressource与big switch case

时间:2013-01-30 08:59:56

标签: android performance switch-statement

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

我需要做的很简单,我想根据int参数动态地为字符串ressource分配一个文本值:

目前我正在使用一个大开关盒

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 个答案:

答案 0 :(得分: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 和比较,基本的Java和Android基础使它变得容易和简短..

由于R.string.XXX是在int value文件中生成的R.java,因此您必须使用int messagesCategory创建该值的刚性数组并获取值。并直接将其设置为TextView ..

答案 1 :(得分:1)

你也可以这样做:

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

快速而无需在内存中加载所有ID。

享受!

答案 2 :(得分:0)

switch case相当于代码中的GOTO,并且没有什么可担心性能。

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

答案 3 :(得分:0)

  1. 我不认为30个case语句不会造成太大的伤害,除非您在循环中执行它们,迭代数组等等。

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