如果我在活动和片段中使用静态字段,那么在内存使用方面是不是很糟糕?

时间:2015-01-03 19:13:39

标签: android android-fragments static fragment

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

起初我以为我会把所有内容都设置为静态,因为每个片段/活动一次只能在内存中只有一个实例(这是正确的吗?)

然后我在这里读到标记为静态的字段永远不会被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...

(我很抱歉,如果我在这里混合了一些东西,我是编程新手......还有英语不是我的第一语言)

感谢任何答案。

3 个答案:

答案 0 :(得分:2)

What is the impact of Static variable ?

静态变量充当GC的“根”。因此,除非你明确地将它们设置为null,否则只要程序存在,它们就会存在,所以从它们可以到达的一切都可以存在。

因此,如果您将视图声明为静态发生的事情,则即使在活动被销毁之后(可能是由于设备方向的更改),创建到活动或片段的引用也会保持活动状态,这会导致内存泄漏。

So should we never use Static ? 

<强> Answer is NO. YOU SHOULD USE STATIC CAUTIOUSLY

如果一个变量或数据只要程序运行就在那里,那么它肯定不是泄漏,它更可能是“永久单身”。如果操作系统尝试访问数据,并且该对象为空,则这是一个更大的问题。所以在这种情况下,静态是有帮助的。

If needed, How to handle the static variable ?

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

希望这有帮助。

答案 1 :(得分:0)

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

因此,这些对象应该保存在static字段中(除非您在onDestroy()中删除这些字段,但实际上,为什么要这么麻烦。)

答案 2 :(得分:0)

您有一个容器,如果您将这些字段设为静态,则表示这些字段是,并且对于此类的所有对象/实例都是通用的。<登记/> 你是对的,对于活动你可能只有一个实例,但这些字段仍属于这一个实例,正如Barend在他的回答中所说,并且与其他人不相同。
此外,垃圾收集的要点是有效的,并且在移动设备上是一个重点,因为资源有限,并且在不小心使用静态时容易发生内存泄漏。

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