假设我有一个单例类(Downloader)负责下载和保存文件。当客户端请求下载时,他还必须提供回调。我的问题是关于那些回调对象的存储。
如果我有一个实现回调接口的Activity然后请求多个大型下载,则Downloader类将无限期地保留对Activity的引用。如果在下载完成之前,请求它们的Activity将经历其生命周期并被销毁。
在这种情况下,Downloader将阻止回收者垃圾收集活动。我不介意请求的下载继续。然而,我想要做的是以某种方式检测到应该收集所提供的回调,并且我实际上是在泄漏它。
是否有类似这样的设计模式?我当时认为其中一个Reference
子类很有用。
感谢。
答案 0 :(得分:1)
反过来做,你可以让他们断开连接,避免高度不推荐的保持活动参考的做法。
我创建了一个非常简单的ServiceLocator类,它保持对所有单例的静态引用并按类型解析它们,但是你可以更简单地做到这一点。您只需要一个包含对Downloader的静态引用的类,并公开对您的活动的引用。如果您需要回调任何活动,请使用Android框架所做的发布/订阅模型(即setOnClickListener(OnClickListener listener)
)。
Downloader可以有一个名为DownloadUpdateListener的内部接口,这个接口的单个实例,以及一个注册和取消注册方法,用于设置它并从活动中删除引用。 Activity将在本地创建一个DownloadUpdateListener实例,以便它可以访问所有Activity的字段和视图。在Downloader中,在调用其方法之前检查您的侦听器是否为null。在onResume中注册您的监听器,不要忘记在onPause
中取消注册