【问题标题】:Is it bad in terms of memory usage if I use static fields in activities and fragments?如果我在活动和片段中使用静态字段,在内存使用方面是否很糟糕?
【发布时间】:2015-01-03 19:13:38
【问题描述】:

我想知道是否应该在活动/片段中声明我的字段是静态的。

一开始我以为我会让所有东西都变成静态的,因为每个片段/活动一次在内存中只有一个实例(这是正确的吗?)

然后我在这里读到标记为静态的字段永远不会被 GC,因为只有对象(连同它们的实例变量)被垃圾收集。我很困惑

这就是我现在的做法......

public class Container extends FragmentActivity implements ActionBar.TabListener {


private static ViewPager sPager;
private static ActionBar sActionBar;
private static PagerAdapter sAdapter;
private static DrawerLayout sDrawerLayout;
private static ListView sDrawerList;
private static ActionBarDrawerToggle sDrawerToggle; 

//more code...

(对不起,如果我在这里混淆了东西,我是编程新手......而且英语不是我的第一语言)

感谢任何答案。

【问题讨论】:

    标签: android android-fragments static fragment


    【解决方案1】:
    What is the impact of Static variable ?
    

    静态变量充当 GC 的“根”。因此,除非您将它们显式设置为 null,否则它们将与程序存在一样长,因此可以从它们访问的所有内容。

    因此,如果您将视图声明为静态,则会发生对 Activity 或片段的引用,即使在 Activity 被销毁(可能是由于设备方向的更改)后仍保持活动状态,这会造成内存泄漏。

    So should we never use Static ? 
    

    Answer is NO. YOU SHOULD USE STATIC CAUTIOUSLY

    如果一个变量或数据打算在程序运行期间一直存在,那么它绝对不是泄漏,它更可能是一个“permanent singleton”。如果操作系统尝试访问数据并且对象为空,则这是一个更大的问题。所以在这种情况下,静态很有帮助。

    If needed, How to handle the static variable ?
    

    您声明为静态的任何变量或视图,都应在活动onDestroy 方法或任何其他适当的方法中分配为空。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您的示例中的对象是一堆视图和一个适配器。视图和适配器的生命周期与它们所属的活动相关联——如果活动消失了,那么构成它的视图也应该消失。

      因此,这些对象不应保存在static 字段中(除非您将onDestroy() 中的这些字段设为空,但实际上,何必如此麻烦)。

      【讨论】:

        【解决方案3】:

        您有一个 class 容器,如果您将这些字段设为静态,则意味着这些字段是 class 的字段,并且对于此类的所有对象/实例都是通用的。 您是对的,对于活动,您可能只有一个实例,但正如 Barend 在他的回复中所说,这些字段仍然属于这个实例,并且与其他字段不常见。
        此外,您对垃圾收集的观点是有效的,并且在移动设备上很重要,因为资源有限并且如果不小心使用静态,很容易发生内存泄漏。

        static:如果一个字段在类的实例之间共享,甚至可能在没有任何实例存在的情况下存在,则使用它。如果不确定,最好不要使用静态。

        【讨论】:

        • 感谢您的回答!你刚刚解释了静态修饰符的作用,我已经知道了。我的问题更多是关于它导致泄漏; )
        • 您已经解释了可能的泄漏 :) 您的活动可能已经消失,但静态变量将保留在内存中,因为它们与消失的实例无关,而是与类本身相关联。如果您对用户访问的每个活动(即使是很短时间)都执行此操作,所有这些数据都会填满 RAM。
        • 另一方面,静态方法不是更快吗?因此,我的大多数方法都是静态的,如果我要从我的字段中删除静态修饰符,我会得到“无法从静态上下文引用非静态字段 X”
        猜你喜欢
        • 2019-09-25
        • 1970-01-01
        • 2011-09-20
        • 2020-02-01
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多