Java Android内存-声明全局变量
我使用一个文本视图,每当我点击一个按钮或关闭某个对话框时,它都会改变 因此,我在onCreate方法之外声明了变量Java Android内存-声明全局变量,java,android,memory,Java,Android,Memory,我使用一个文本视图,每当我点击一个按钮或关闭某个对话框时,它都会改变 因此,我在onCreate方法之外声明了变量 private TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); text = (TextView) findViewById(R.id.text); } 在内存堆中,我发现TextV
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
text = (TextView) findViewById(R.id.text);
}
在内存堆中,我发现TextView使用了大量内存大小
问题
如果每次需要时都声明变量,会更好吗。这样地。那么,最好的方法是什么
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView text = (TextView) findViewById(R.id.text);
text.setText("Blabla");
}
private void setText(String text) {
TextView text = (TextView) findViewById(R.id.text);
text.setText(text);
}
private void onDismiss...() { // Just an example, I have many methods
TextView text = (TextView) findViewById(R.id.text);
text.setText("cancelled");
text.setTextSize(32 * scale);
}
哪个更好取决于你的需要。您的应用程序成本可以从不同方面查看。如内存成本、计算成本等 现在,为了记忆的目的,第二个更好,因为它不会让记忆一直被占用 但从计算的角度来看,每次你需要启动同样的事情。同样的结果,但同样的工作是一次又一次地做。设备需要分配一个新的内存,发送它的引用,当它被删除时,再次分配相同的东西到内存的另一部分可能会被删除
所以,你应该选择要牺牲哪一个。所以你需要了解一些事情
text=(TextView)findViewById(R.id.text)代码>
上面这一行并不意味着您正在创建一个TextView
。一旦遇到setContentView()
,就会创建布局中的视图。这是视图的创建完成时,而不是执行findViewById()
时。上面的代码行,只为您获取一个已在内存中的TextView
的引用
findViewById()
可以吗?如果布局有许多视图,层次结构太深,并且使用的是RelativeLayout
,那么始终为同一视图调用findViewById()
也会浪费代码行和性能成本(非常轻微)因此,我建议您使用您建议的
方法1
。这使代码保持整洁<代码>方法2决不会比方法1减少内存消耗。是的,第二种方法更好。我自己做的。你不是在声明一个全局变量,而是一个私有变量。如果第二种方法导致更少的内存消耗,我会非常惊讶。我可以想象findViewById()
只是返回一个现有控件,而不重新创建或处理它(当它超出范围时),这意味着第一种方法和第二种方法应该使用相同的内存量,因为在该布局中只有一个TextView
(使用R.id.text
)但是第一种方法会稍微快一些,因为您已经找到并强制转换了TextView
,并且正在重用引用而不是进行查找。这是一个字段变量,而不是全局变量。不要使用第二种方法,按ID查找视图是一项繁重的操作,您应该避免它(阅读适配器中的视图保持器模式)。