【问题标题】:Long-lasting reference to an Activity - Lifecycle对活动的长期引用 - 生命周期
【发布时间】:2012-02-06 21:47:06
【问题描述】:

假设我有一个单例类(Downloader)负责下载和保存文件。当客户端请求下载时,他还必须提供回调。我的问题是关于那些回调对象的存储。

如果我有一个实现回调接口的 Activity,然后请求多个大下载,Downloader 类将无限期地持有对该 Activity 的引用。如果在下载完成之前,请求它们的 Activity 经历了它的生命周期并被销毁怎么办。

在这种情况下,Downloader 将阻止回收器对 Activity 进行垃圾收集。我不介意请求的下载继续。然而,我想做的是以某种方式检测到应该收集提供的回调,并且我实际上正在泄漏它。

有这样的设计模式吗?我在想Reference 子类之一会很有用。

谢谢。

【问题讨论】:

    标签: java android lifecycle object-lifetime


    【解决方案1】:

    反之亦然,您可以使它们保持断开连接,并避免保留活动引用的非常不推荐的做法。

    我创建了一个非常简单的 ServiceLocator 类,它保留对我所有单例的静态引用并按类型解析它们,但您可以更简单地执行此操作。您只需要一个包含对您的下载器的静态引用并将该引用公开给您的活动的类。如果您需要回调任何活动,请使用 Android 框架所做的发布/订阅模型(即setOnClickListener(OnClickListener listener))。

    Downloader 可以有一个名为 DownloadUpdateListener 的内部接口、该接口的单个​​实例,以及用于设置它并从您的活动中删除引用的注册和取消注册方法。 Activity 将在本地创建它的 DownloadUpdateListener 实例,因此它可以访问 Activity 的所有字段和视图。在 Downloader 中,在调用其方法之前检查您的侦听器是否为空。在 onResume 中注册你的监听器,不要忘记在 onPause 中取消注册

    【讨论】:

    • 订阅/取消订阅虽然有效,但有点限制。我还使用来自非 Activity 对象(如适配器)的下载器,据我所知,它们不知道它们封闭的 Activity 生命周期。这要么迫使我为我的适配器实现 onPause/onResume 方法并在 Activity 中调用它们,要么使用其他技巧
    • 那么你需要一个像我一样的 ServiceLocator。我可以在我的应用程序中的任何位置解决任何问题,因为我的 ServiceLocator 拥有对我所有单例的静态引用。
    • 我想我不明白 ServiceLocator 是如何解决这个问题的。下载器仍然需要保存对回调的引用,对吧?
    • 这是我计划在 GitHub 上发布的内容并发表一篇博文,但我还没有这样做。如果您希望我与您分享这门课程并解释如何/为什么,请通过 aguynamedrich [at] gmail 给我发电子邮件
    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2013-01-13
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多