【问题标题】:Android: avoiding passing activity to singletons by storing inside the Application class = memory leak?Android:通过存储在Application类中避免将活动传递给单例=内存泄漏?
【发布时间】:2015-08-25 13:24:19
【问题描述】:

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

在我的应用程序类中:

private static Activity currentForegroundActivity;

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

public static Activity getCurrentlyVisibleActivity() {
    return currentForegroundActivity;
}

在每个活动中:

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

    App.setCurrentlyVisibleActivity(this);

在每个单例中:

methodThatRequiresUI(App.getCurrentlyVisibleActivity);

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

【问题讨论】:

  • 不要存储对活动的引用(如果真的需要使用 WeekReference,但这也是个坏主意)。您可能需要在需要引用上下文的单例方法中再添加一个参数。
  • “我有几个单例...可能必须显示对话框”——这是一个错误,您应该修复它。
  • 永远不要忘记保持简单愚蠢

标签: java android


【解决方案1】:
  1. 完全避免对单例对象使用活动上下文 那个。(是的,你知道这一点)
  2. 不要从应用上下文中膨胀视图和对话框。它会起作用,但它 将排除样式和其他内容。

那怎么办?

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

  2. 使用委托(传递匿名类,或 界面)

【讨论】:

  • 我的问题是某些类会覆盖没有上下文作为输入参数的方法-例如,google api登录流程需要各种方法中的上下文信息-我无法控制这些方法被调用,我也不能向它们添加输入参数。如果我不能从应用程序中提取上下文信息,那么我必须将其存储在类中,这正是我想要避免做的事情。还有其他方法吗?
  • 活动可能会被销毁和创建,您的操作系统将控制它。因此,您喜欢使用包、数据库、共享首选项或文件(json、xml、raw)来保存和恢复您的状态。您需要将您的上下文相关逻辑与其他逻辑分开。我不知道你到目前为止做了什么,但也许你可以为上下文相关的逻辑创建单独的管理器类。如果你改变它为时已晚,那么你可以尝试在 Destroy 上清除你的上下文,并设置 oncreate再次。还有很多陷阱等着你,内存不足,空指针甚至可能泄漏窗口
猜你喜欢
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2021-08-18
  • 2021-12-05
  • 2020-07-21
  • 1970-01-01
相关资源
最近更新 更多