在Android中清除声明和使用变量

时间:2012-10-11 14:47:55

标签: android performance variables

每隔一段时间,输入一个新的活动需要更新值,比如说几个TextView。所以,假设我在起始活动的n String内写了n TextView个。

哪种方法是保证良好性能和提供“干净代码”的最佳方法?

变体1 (我实际应用的方式): 我声明一个TextView变量“tempText”作为全局变量,并指定TextView更新到此变量(或者在一个额外的方法中)。 或者,a)在onCreate()中执行整个过程,而b)在一个方法中处理所有内容,例如updateTextViews()

(...)

public class MyActivity extends Activity{

    private TextView tempText;

    public onCreate(Bundle icicle){
        (...)

        tempText = (TextView) findViewById(R.id.tv_1);
        tempText.setText(string_1);

        tempText = (TextView) findViewById(R.id.tv_2);
        tempText.setText(string_2);

        (...)

        tempText = (TextView) findViewById(R.id.tv_n);
        tempText.setText(string_n);
    }
}

变体2 : 我在TextView或相应的方法中声明了一个onCreate()变量“tempText”作为变量,并指定TextView来更新此变量。 其余的与Variant 1类似。

(...)

public class MyActivity extends Activity{

    public onCreate(Bundle icicle){
        (...)

        private TextView tempText;

        tempText = (TextView) findViewById(R.id.tv_1);
        tempText.setText(string_1);

        tempText = (TextView) findViewById(R.id.tv_2);
        tempText.setText(string_2);

        (...)

        tempText = (TextView) findViewById(R.id.tv_n);
        tempText.setText(string_n);
    }
}

变体3: 我为每个要更新的TextView声明了一个全局TextView变量。据我所知,这需要RAM中更多空间,但我不知道对速度的影响。在这里,在onCreate()(a))或单独的方法(b)中处理它有区别吗?

(...)

public class MyActivity extends Activity{

    private TextView tempText_1;
    private TextView tempText_2;
    (...)
    private TextView tempText_n;

    public onCreate(Bundle icicle){
        (...)

        tempText_1 = (TextView) findViewById(R.id.tv_1);
        tempText_1.setText(string_1);

        tempText_2 = (TextView) findViewById(R.id.tv_2);
        tempText_2.setText(string_2);

        (...)

        tempText_n = (TextView) findViewById(R.id.tv_n);
        tempText_n.setText(string_n);
    }
}

变式4: 我为TextView中要更新的每个TextView声明了一个onCreate()变量,或者处理此问题的相应方法。其余的与Variant 3类似?

(...)

public class MyActivity extends Activity{


    public onCreate(Bundle icicle){
        (...)

        private TextView tempText_1;
        private TextView tempText_2;
        (...)
        private TextView tempText_n;

        tempText_1 = (TextView) findViewById(R.id.tv_1);
        tempText_1.setText(string_1);

        tempText_2 = (TextView) findViewById(R.id.tv_2);
        tempText_2.setText(string_2);

        (...)

        tempText_n = (TextView) findViewById(R.id.tv_n);
        tempText_n.setText(string_n);
    }
}

哪一种是“最佳”方法?变体1和2仅在RAM中保留一个存储器地址并使用它,而根据Robert C. Martins的“清洁代码”,变量实际上是模糊的。选项3和4恰恰相反。但对于其他人,我不太了解其他影响。

2 个答案:

答案 0 :(得分:3)

就个人而言,如果我需要在Activity的其他地方再次访问TextViews,我会使用Variant 3(例如在onResume中,这是我通常放置静态UI更新的地方)。如果setText是一次性的东西,我会做类似的事情 -

((TextView) findViewById( R.id.tv_1 ) ).setText( string_1 );
((TextView) findViewById( R.id.tv_2 ) ).setText( string_2 );

如果有任何疑问,视图可能不存在(即在开发期间修改布局时),我会使用包装器,如 -

private void safeSetText( int id, String caption ) {
    TextView tv = (TextView) findViewById( id );
    if( tv != null )
        tv.setText( caption );
    else
        Log.d( "..... " );
}

然后在onCreate上:     safeSetText(R.id.tv_1,string_1);     safeSetText(R.id.tv_2,string_2);

答案 1 :(得分:1)

如果要在整个活动中使用该值,请像往常一样将其声明为类中的成员变量。没有像你在OnCreate中声明的那样,它仍然是一个成员变量。它与在课堂上宣布一样好,它将提高可读性。

此外,如果您在任何地方声明成员变量,它将占用相同数量的ram。你没有任何东西可以获得/放松。

如果你确定一个变量只在本地使用,在本地声明它,它将被分配在堆栈而不是堆中,并且一旦你退出块就会消失。

没有这样的android优化方式来声明变量。您可以遵循正常的面向对象/ Java方式。