我是Android新手,并且一直在阅读内存管理在那些内存有限的应用程序中非常重要。
我已经阅读了一些活动的findViewById()
非常昂贵的地方。所以我想知道,如果将视图存储为全局变量并重用该对象是一个好习惯吗?或者每次我需要使用视图时运行findViewById()
会更好吗?
谢谢, 千电子伏
答案 0 :(得分:5)
如果您的意思是static variable
global variable
,那么永远不会这样做!如果您将视图保留为静态变量,那么持有视图的活动就会泄漏。
您在屏幕上看到的所有视图都附加到某个活动,并且它们持有对活动的引用,如果您保持对其中一个视图的静态引用,则活动将永远不会被活动时进行垃圾回收 kill (通过按BACK键或在活动上调用finish()
方法)。
对于findViewById()
,我认为你不需要太在意它的性能,它可能会暴露一些开销,但它只是相对昂贵,它足够快对于大多数应用程序。
答案 1 :(得分:4)
当你说"将视图存储为全局变量"时,我想你的意思是"在Activity类中保留对视图的引用作为私有属性"。就内存而言,这应该不是问题:保留对视图的附加引用并不意味着将整个对象再次存储在内存中。
您必须记住的是,如果您保留对对象的引用,则垃圾收集器将无法从内存中清除它,即使不再需要它也是如此。但是因为你的视图可能不应该在你的活动之前被销毁,所以在Activity类中保持对它的引用不应该导致内存泄漏。
简而言之:如果您需要经常在Activity类中访问您的视图,我会说这是一个很好的做法。至少这就是我所做的,所以如果有人不同意,我会非常有兴趣知道原因。
答案 2 :(得分:1)
是的,最好将Views作为活动的成员变量。(在java中没有全局变量,在类中声明的变量称为成员变量)。
public MyActivity extends Activity{
private View mView;
public void onCreate(Bundle savedState){
super.onCreate(savedState);
setContentView(layout);
mView = findViewById(id);
}
}
答案 3 :(得分:0)
将其存储为您班级的私人成员是您多次使用的典型内容。指向这样的对象的指针。很小。