android - 使应用程序类单例会导致内存泄漏吗?

标签 android memory-leaks leakcanary

我为我的应用程序创建了一个自定义应用程序类。此类 onCreate 像这样设置自身的静态变量

public void onCreate() {
  super.onCreate();
  mInstance = this;
}
public static ChattyApp getInstance() {
  return mInstance;
}

然后我使用 App.getInstance() 方法将应用程序上下文获取到非 Activity/fragment 类(如 API Controller 或其他类)。它会导致内存泄漏吗?

我设置了 leak canary,它显示了 Application 类的实例变量上的内存泄漏。此变量保留 socket.io 的套接字引用,以便我可以在应用程序的任何位置使用它。

最佳答案

这是一个很好的问题,SO 上的人们对此进行了广泛的讨论。看看thisthis

虽然根据第一个链接中的讨论,这似乎是一种将 Context 存储在 Application 类中的好方法,但可以有更好的方法来处理这个问题。

理想情况下,对于每个逻辑单元,您应该有一个单独的类来处理它,而不是污染您的应用程序类。但是,您的应用程序类可以initializesetup 那些其他类。这将创建关注点分离。

另一种方法是使用 Dagger2 ,这是一个依赖项注入(inject)框架,可将您的套接字引用注入(inject)到您想要的任何位置。

Dagger 2 has a steep learning curve and but a very important tool to learn as an Android developer

关于android - 使应用程序类单例会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56660758/

相关文章:

android - 卡在 "Dumping memory, app will freeze. Brrr."消息

java - 查找 Activity 代码中的内存泄漏,以释放内存使用并避免 OutOfMemory 异常

java - 无法删除旧的 javaCompile 操作,可能类名已更改

java - Hashmap 中带有空格的 JSON - 来自 api

当 valgrind 说没有内存泄漏时,内存泄漏的可能性

performance - Vaadin 在 Internet Explorer 中运行缓慢

javascript - 浏览器使用 AJAX + setInterval 不断占用内存

android - 添加 fragment 并调用 .replace() 导致添加的 fragment 中的内存泄漏

android - 指南针和加速度计精度

android - GCM 云连接服务器 (CCS) 是否存储消息