【问题标题】:Why say static activity is a bad practice in Android为什么说静态活动在 Android 中是一种不好的做法
【发布时间】:2017-01-12 08:34:28
【问题描述】:
public static MainActivity mainActivity ;

public static MainActivity instance() {
    return mainActivity  ;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_navigation);
    mainActivity  = this;

}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mainActivity  != null) {
        mainActivity  = null;       
    }      
}

为什么会内存泄漏?为什么我们说这篇文章很糟糕? 我想从GC原理来理解。

【问题讨论】:

  • 来自对标记为重复的问题的回答:“该类分配了一大块内存(例如新字节[1000000]),将对其的强引用存储在静态字段中,然后存储在 ThreadLocal 中对自身的引用。”。由于 Activity 分配了大量内存(用于其视图)并且您将强引用放在静态字段中,因此您现在需要做的就是拥有一个具有更长生命周期引用该静态字段的类。那么你就会造成内存泄漏

标签: java android memory-leaks garbage-collection


【解决方案1】:

onDestroy 并不总是被调用,如果不是,你会泄漏。 onStop 总是被调用,如果你确实将 mainActivity 设置为 null 你可能没有泄漏。但我想知道为什么你会需要这个。

还有,你的:

public static MainActivity instance() {
    if(mainActivity == null){
         mainActivity  = this;
    }
    return mainActivity  ;
}

是静态的并使用“this”,我认为这是不可能的。静态方法中没有“this”。

【讨论】:

  • 谢谢。“this”是我的错误,我更正了。其实我不需要它,我只知道为什么我们说这篇文章写得那么糟糕,我想从GC原理。
  • 好吧,因为你不能完全“相信” onDestroy 被调用。将它放在 onStop 可能很好,但很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 2011-06-01
  • 2010-12-22
  • 2015-10-29
  • 2011-05-14
相关资源
最近更新 更多