java - Android:通过存储在应用程序类中避免将 Activity 传递给单例=内存泄漏?

标签 java android

我有一些需要上下文信息的单例,因为它们可能必须显示对话框。到目前为止,我已经将相关上下文传递给了单例,但这越来越多地导致内存泄漏。我想知道在应用程序类中存储对当前 Activity 的引用是否可以解决这个问题。由于每次新 Activity 启动时都会覆盖该变量,因此不会导致内存泄漏,但也可以从应用程序中的所有非 Activity 类访问该变量。

在我的应用程序类中:

private static Activity currentForegroundActivity;

public static void setCurrentlyVisibleActivity(Activity activity) {
    currentForegroundActivity = activity;
}

public static Activity getCurrentlyVisibleActivity() {
    return currentForegroundActivity;
}

在每个 Activity 中:

@Override
public void onResume() {
    super.onResume();

    App.setCurrentlyVisibleActivity(this);

在每个单例中:

methodThatRequiresUI(App.getCurrentlyVisibleActivity);

您可以预见这条路线上是否存在任何陷阱?我想应用程序类可能会被操作系统从内存中清除,但如果发生这种情况,应用程序本身将重新启动 - 它不会导致空指针。 get 方法也可能在应用程序启动期间在调用该集合之前被调用 - 但我可以编写检查来解决这个问题。

最佳答案

  1. 完全避免使用 Activity 上下文到单例对象 那个。(是的,你知道这一点)
  2. 不要从应用程序上下文中夸大 View 、对话框。它会起作用,但是它 将排除样式和其他内容。

那怎么办?

  1. 使用静态方法创建实用方法,将上下文传递为 范围。

  2. 使用委托(delegate)(传递匿名类,或 接口(interface))

关于java - Android:通过存储在应用程序类中避免将 Activity 传递给单例=内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32205247/

相关文章:

android - Sony Xperia (E2003) 中的调试突然停止工作

android - startActivityForResult 的替代方案

java - Jersey 客户端将内容类型 header 设置为文本/纯文本

Java 远程调试不适用于 Eclipse 或 IntelliJ 。需要帮助

java - 用 Java 玩纸牌

Java Spring Derby - 特定于单元测试的数据源

java - 使用服务时未找到 Activity

java - 如何停止使用@Scheduled注释启动的计划任务?

android - 什么时候我们需要根据 ps 而不是 px 来计算大小?

java - 如何在 Android Studio 上向我的项目添加库?