3

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

我读过一些该活动findViewById()非常昂贵的地方。所以我想知道,将您将用作全局变量的视图存储并重用该对象是否是一种好习惯?findViewById()还是每次我需要使用视图时运行更好?

谢谢,凯夫

4

4 回答 4

5

如果您的意思是static variableglobal variable那么永远不要那样做!如果您将视图保留为静态变量,则持有视图的活动将泄漏。

您在屏幕上看到的所有视图都附加到某个活动,并且它们持有对该活动的引用,如果您保持对其中一个视图的静态引用,那么当活动被杀死时,活动将永远不会被垃圾收集(通过按 BACK 键或调用finish()活动上的方法)。

至于findViewById(),我认为你不需要太在意它的性能,它可能会暴露一些开销,但它只是相对昂贵,对于大多数应用程序来说已经足够快了。

于 2013-05-24T03:47:50.900 回答
5

当您说“将视图存储为全局变量”时,我猜您的意思是“将对视图的引用保留为 Activity 类中的私有属性”。就内存而言,这应该不是问题:保持对视图的附加引用并不意味着将整个对象再次存储在内存中。

您必须记住的是,如果您保留对对象的引用,即使不再需要它,垃圾收集器也无法从内存中清除它。但是由于您的视图可能不应该在您的活动之前被销毁,因此在 Activity 类中保留对它的引用不应导致内存泄漏。

简而言之:如果您需要在 Activity 类中经常访问您的视图,我会说这是一个很好的做法。至少这是我所做的,所以如果有人不同意,我很想知道为什么。

于 2013-05-24T03:50:03.877 回答
1

是的,最好将视图作为活动的成员变量。(在 java 中没有全局变量,在类中声明的变量称为成员变量)。

public MyActivity extends Activity{
    private View mView;

    public void onCreate(Bundle savedState){
        super.onCreate(savedState);
        setContentView(layout);
        mView = findViewById(id);
    }
}
于 2013-05-24T03:52:04.353 回答
0

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

于 2013-05-24T03:47:06.350 回答