Android:将类作为全局变量存储在类中是一种好习惯吗?

时间:2013-05-24 03:34:49

标签: android performance

我是Android新手,并且一直在阅读内存管理在那些内存有限的应用程序中非常重要。

我已经阅读了一些活动的findViewById()非常昂贵的地方。所以我想知道,如果将视图存储为全局变量并重用该对象是一个好习惯吗?或者每次我需要使用视图时运行findViewById()会更好吗?

谢谢, 千电子伏

4 个答案:

答案 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)

将其存储为您班级的私人成员是您多次使用的典型内容。指向这样的对象的指针。很小。