【发布时间】:2013-05-24 03:34:48
【问题描述】:
我是 Android 新手,并且一直在读到内存管理在那些内存有限的应用程序中非常重要。
我读过一些内容,该活动的findViewById() 非常昂贵。所以我想知道,将您将用作全局变量的视图存储并重用该对象是否是一种好习惯?还是每次我需要使用视图时运行findViewById() 会更好?
谢谢, 凯夫
【问题讨论】:
标签: android performance
我是 Android 新手,并且一直在读到内存管理在那些内存有限的应用程序中非常重要。
我读过一些内容,该活动的findViewById() 非常昂贵。所以我想知道,将您将用作全局变量的视图存储并重用该对象是否是一种好习惯?还是每次我需要使用视图时运行findViewById() 会更好?
谢谢, 凯夫
【问题讨论】:
标签: android performance
如果您的意思是static variable by global variable,那么永远不要这样做!如果您将视图保留为静态变量,则持有视图的活动将会泄漏。
您在屏幕上看到的所有视图都附加到某个活动,并且它们持有对该活动的引用,如果您保留对其中一个视图的静态引用,则该活动将永远不会在活动时被垃圾回收被杀死(通过按 BACK 键或在活动上调用 finish() 方法)。
至于findViewById(),我认为你不需要太在意它的性能,它可能会暴露一些开销,但它只是相对昂贵,对于大多数人来说已经足够快了应用程序。
【讨论】:
当您说“将视图存储为全局变量”时,我猜您的意思是“将对视图的引用保留为 Activity 类中的私有属性”。就内存而言,这应该不是问题:保留对视图的附加引用并不意味着将整个对象再次存储在内存中。
您必须记住的是,如果您保留对对象的引用,即使不再需要它,垃圾收集器也无法从内存中清除它。但是由于您的视图可能不应该在您的活动之前被销毁,因此在 Activity 类中保留对它的引用不应导致内存泄漏。
简而言之:如果您需要在 Activity 类中频繁访问您的视图,我会说这是一个很好的做法。至少这是我所做的,所以如果有人不同意,我很想知道为什么。
【讨论】:
是的,最好将视图作为活动的成员变量。(在 java 中没有全局变量,在类中声明的变量称为成员变量)。
public MyActivity extends Activity{
private View mView;
public void onCreate(Bundle savedState){
super.onCreate(savedState);
setContentView(layout);
mView = findViewById(id);
}
}
【讨论】:
将它存储为类的私有成员对于您将多次使用的东西是典型的。指向这样的对象的指针。很小。
【讨论】: