如果我在活动和片段中使用静态字段,在内存使用方面是否不好?
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。
希望这对您有所帮助。
我想知道我是否应该在 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。
希望这对您有所帮助。