Android-视图的类变量与方法变量
在处理Android视图时,哪种方式是更好的内存管理编程方式?我相信第二种方法更好,因为TextView只在需要时才被访问,然后,希望是垃圾收集。我很想听听你的意见Android-视图的类变量与方法变量,android,performance,Android,Performance,在处理Android视图时,哪种方式是更好的内存管理编程方式?我相信第二种方法更好,因为TextView只在需要时才被访问,然后,希望是垃圾收集。我很想听听你的意见 public class MainActivity extends Activity { TextView tvHelp; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(sav
public class MainActivity extends Activity {
TextView tvHelp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvHelp = (TextView) layout.findViewById(R.id.ivHelp);
tvHelp.setText("Started");
}
@Override
public void onResume() {
super.onResume();
tvHelp.setText("Resumed");
}
}
还是这个
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tvHelp = (TextView) findViewById(R.id.ivHelp);
tvHelp.setText("Started");
}
@Override
public void onResume() {
super.onResume();
TextView tvHelp = (TextView) findViewById(R.id.ivHelp);
tvHelp.setText("Resumed");
}
}
这没什么区别。第一个将帮助您避免多次调用
findViewById()
,这会消耗CPU。第二个将帮助您在堆上保留一些字节。但通过这样做,您还将创建未引用的对象,这些对象将堆叠在堆上,直到GC通过(这是CPU消耗)。当内存耗尽时(例如,当您创建未引用的对象时),GC也将启动。所以第一个解决方案肯定是最好的。
您将避免:
- 代码重复
- 多次调用
findViewById
- 未引用的对象,这些对象将堆叠在堆中,直到GC通过
- 这没什么区别。第一个将帮助您避免多次调用
findViewById()
,这会消耗CPU。第二个将帮助您在堆上保留一些字节。但通过这样做,您还将创建未引用的对象,这些对象将堆叠在堆上,直到GC通过(这是CPU消耗)。当内存耗尽时(例如,当您创建未引用的对象时),GC也将启动。所以第一个解决方案肯定是最好的。
您将避免:
- 代码重复
- 多次调用
findViewById
- 未引用的对象,这些对象将堆叠在堆中,直到GC通过
onDestroy()
,它和它的视图层次结构都将被垃圾收集,因此对于这种情况,我不必担心区别
这可能产生不同的一种情况是片段
s中的视图
生命周期与组件生命周期不同。从onCreateView()
或onViewCreated()
保存对视图的引用会在它们返回时暂时导致额外的内存使用。您可以在onDestroyView()
中释放引用,因为它们无论如何都无效——除非您手动保留整个视图层次结构
欲了解更多信息:在您的情况下,就内存消耗而言,这并没有什么区别。无论您是否保留对该视图的引用,该活动都将通过其层次结构保留对该视图的引用,直到该视图被销毁。释放对它的引用不会使它被垃圾收集
一旦活动通过onDestroy()
,它和它的视图层次结构都将被垃圾收集,因此对于这种情况,我不必担心区别
这可能产生不同的一种情况是片段
s中的视图
生命周期与组件生命周期不同。从onCreateView()
或onViewCreated()
保存对视图的引用会在它们返回时暂时导致额外的内存使用。您可以在onDestroyView()
中释放引用,因为它们无论如何都无效——除非您手动保留整个视图层次结构
更多信息:问题是我有一个相当大的应用程序,我用第一种方法来做,这在堆上变得非常昂贵,因为有很多视图。该应用程序运行缓慢,因为它占用了大量内存来保存这些视图。我一直认为第二种方法更好,因为至少内存使用会更加动态,如果对象不被使用,它们不会留在周围。使用第二种解决方案确实会获得一些内存,但我怀疑这是否会降低应用程序的速度。您是否在整个应用程序中仅使用了一项活动?从一个活动切换到另一个活动时,您持有的视图/资源将是GC。问题是,我有一个相当大的应用程序,我用第一种方法做它,这在堆上变得非常昂贵,因为有很多视图。该应用程序运行缓慢,因为它占用了大量内存来保存这些视图。我一直认为第二种方法更好,因为至少内存使用会更加动态,如果对象不被使用,它们不会留在周围。使用第二种解决方案确实会获得一些内存,但我怀疑这是否会降低应用程序的速度。您是否在整个应用程序中仅使用了一项活动?从一个活动切换到另一个活动时,您持有的视图/资源将是GC。你也可以看看这是否有什么不同。