Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android内存-声明全局变量_Java_Android_Memory - Fatal编程技术网

Java Android内存-声明全局变量

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

我使用一个文本视图,每当我点击一个按钮或关闭某个对话框时,它都会改变

因此,我在onCreate方法之外声明了变量

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查找视图是一项繁重的操作,您应该避免它(阅读适配器中的视图保持器模式)。