我是 Android 新手,并且一直在阅读内存管理在那些内存有限的应用程序中非常重要。
我读过一些该活动findViewById()
非常昂贵的地方。所以我想知道,将您将用作全局变量的视图存储并重用该对象是否是一种好习惯?findViewById()
还是每次我需要使用视图时运行更好?
谢谢,凯夫
我是 Android 新手,并且一直在阅读内存管理在那些内存有限的应用程序中非常重要。
我读过一些该活动findViewById()
非常昂贵的地方。所以我想知道,将您将用作全局变量的视图存储并重用该对象是否是一种好习惯?findViewById()
还是每次我需要使用视图时运行更好?
谢谢,凯夫
如果您的意思是static variable
,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);
}
}
将其存储为班级的私人成员对于您将多次使用的东西是典型的。指向这样的对象的指针。很小。