每隔一段时间,输入一个新的活动需要更新值,比如说几个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恰恰相反。但对于其他人,我不太了解其他影响。
答案 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方式。