【问题标题】:Android: Singleton references activity, memory leak?Android:单例引用活动,内存泄漏?
【发布时间】:2020-07-21 04:47:03
【问题描述】:

首先,如果我的问题是愚蠢的,我想说声抱歉,我只是从 Android 开始。我在网上发现了一些文章,指出引用活动的单例导致内存泄漏。 我无法理解这是怎么发生的! 想象一下这样的情况——我们有一个名为MyInterface 的接口,有一个名为MySingleton 的单例和一个实现MyInterface 的活动

interface MyInterface {
   void foo();
}

class MySingleton {
  static MySingleton shared;
  MyInterface delegate;
  private MySingleton() {};

  MySingleton getShared() {
   if(shared == null)
     shared = MySingleton();
   return shared
  }

  void setDelegate(MyInterface delegate) {
   this.delegate = delegate;
  }

class MyActivity extends AppCompatActivity implements MyInterface {

 @Override
 void foo() {//do something}

 @Override
 void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     MySingleton.getShared().setDelegate(this);
     // do other setup
 }    

由于 Java 没有循环引用,因此垃圾收集 MyActivity 应该没有问题,还是我错了?如果问题是假的,再次感谢,谢谢

【问题讨论】:

  • “垃圾回收MyActivity应该没有问题” 怎么会? MySingleton 持有对 Activity 的引用。

标签: android android-studio android-activity android-memory appcompatactivity


【解决方案1】:

在发生这种情况的情况下,您的活动生命周期比 MySingleton 长,因此您的单例具有 Activity 的生命周期,但在大多数情况下(取决于架构,您有单一活动应用程序的纬度)活动生命周期将是所有进程,或您正在运行的应用程序。

有一些关于 android 内存泄漏的文章。 请检查它们:

https://proandroiddev.com/everything-you-need-to-know-about-memory-leaks-in-android-d7a59faaf46a

https://android.jlelse.eu/9-ways-to-avoid-memory-leaks-in-android-b6d81648e35e

【讨论】:

  • 感谢您的回答,所以如果我将覆盖 MyActivity.onDestroy 并将委托设置为 null 那么问题应该得到解决吗?
  • 是的,应该有帮助。
【解决方案2】:

我没有看到您的代码中发生任何内存泄漏。

在 Java 中:

当垃圾收集器认为对象静止时会发生内存泄漏 需要,因为它被另一个对象引用。

内存泄漏的常见来源:

  • 匿名类
  • 内部类
  • 回调方法
  • 引用 Activity 或 Fragment 的静态变量
  • RxJava
  • 异步任务
  • 定时器任务
  • 处理程序
  • 单例

如果一个单例持有对活动的引用并且比 活动,您的应用面临内存泄漏。

【讨论】:

    猜你喜欢
    • 2012-05-25
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多