0

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

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

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

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

谢谢。

4

1 回答 1

1

反过来做,你可以让它们保持断开连接,避免高度不推荐的保留活动引用的做法。

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

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

于 2012-02-06T21:56:00.327 回答