如果我在活动和片段中使用静态字段,在内存使用方面是否不好?

Is it bad in terms of memory usage if I use static fields in activities and fragments?

我想知道我是否应该在 activities/fragments 中将我的字段声明为静态或不声明。

起初我以为我会把所有东西都做成静态的,因为每个 fragment/activity 一次在内存中只有一个实例(这是正确的吗?)

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

(很抱歉,如果我在这里混淆了东西,我是编程新手...而且英语不是我的母语)

如有任何答案,我们将不胜感激。

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

因此,这些对象应该 保存在 static 字段中(除非您将 onDestroy() 中的那些字段置空,但实际上,何必呢)。

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

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

What is the impact of Static variable ?

静态变量作为 GC 的 "roots"。因此,除非您将它们显式设置为 null,否则它们将与程序存在的时间一样长,从它们可以访问的所有内容也是如此。

因此,如果您将视图声明为静态的,那么创建到 activity 或片段的引用即使在 activity 被销毁后仍保持活动状态(可能是由于设备发生变化)方向)会造成内存泄漏。

So should we never use Static ? 

Answer is NO. YOU SHOULD USE STATIC CAUTIOUSLY

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

If needed, How to handle the static variable ?

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

希望这对您有所帮助。