【问题标题】:Android: Is it good practice to store Views as global variable in class?Android:将视图存储为类中的全局变量是一种好习惯吗?
【发布时间】:2013-05-24 03:34:48
【问题描述】:

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

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

谢谢, 凯夫

【问题讨论】:

    标签: android performance


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        public MyActivity extends Activity{
            private View mView;
        
            public void onCreate(Bundle savedState){
                super.onCreate(savedState);
                setContentView(layout);
                mView = findViewById(id);
            }
        }
        

        【讨论】:

        • 这样的说法值得推理。为什么它更好?总是这样吗?
        • 如问题本身所述,将 findViewByid 与仅读取成员变量进行比较时,它的操作成本更高。由于您将在多个位置使用视图的实例,因此最好将其设为成员变量。 (绝对不是静态的,因为它泄露了整个上下文)
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-10-13
          • 1970-01-01
          • 2014-12-23
          • 1970-01-01
          • 2011-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多