我需要为循环依赖使用 WeakReference 吗?
Do I need to use a WeakReference for circular dependency?
我们在这里谈论Android。我们使用 Model-View-Presenter 方法为我们的架构建模,我们遇到了一个关于 weak references.
的问题
快速信息:
- Presenter 处理逻辑、网络调用等
- 视图处理在屏幕上显示数据、显示加载栏等。
Activity/Fragment class 包含对 主持人 的引用。
presenter classes 持有对 view classes 的引用。
我们的view类其实就是通常由Activity/Fragment实现的接口。这意味着 Activity/Fragment -> presenter
和 presenter -> view (an Activity/Fragment)
之间存在循环依赖。出于这个原因,我们让 presenter
持有对 view (Activity/Fragment)
.
的 弱引用
今天我们需要在同一个 Activity
中使用 2 个 views(以显示不同的模型数据),所以我们没有 implements
在 Activity
但创建了 2 个匿名 class。这最终导致 presenter
丢失了 view
的引用(因为它是一个弱引用)。
现在我们正在评估 2 个可能性:
- 我们真的不需要
presenters
在 View
上保存 WeakReference
因为这种类型的循环依赖不会泄漏内存。
- 我们没有使用匿名 classes,而是在
Activity
上持有一个引用(因此演示者和 activity 都有对视图的引用)只是为了为了它没有被释放(感觉很臭)。
是哪个,需要presenter持有view作为弱引用吗?
答案是 1 - 在这种情况下,演示者中不需要 WeakReference。我成功地使用了相同的模式。没有发生内存泄漏 - 当 activity 被 GC 时,演示者随之而来。但是可能还有其他类型的问题 - 如果您在某个地方(例如在 AsyncTask 中)保留对演示者的硬引用。
正如 Galya 已经指出的,在 Presenter
上不需要 WeakReference
,因为它会在 Activity
被销毁时被销毁。但是如果我正确理解你的问题,你可以尝试 "fix" MVP 模式。也许 VIPER 模式可以帮助您?
我们在这里谈论Android。我们使用 Model-View-Presenter 方法为我们的架构建模,我们遇到了一个关于 weak references.
的问题快速信息:
- Presenter 处理逻辑、网络调用等
- 视图处理在屏幕上显示数据、显示加载栏等。
Activity/Fragment class 包含对 主持人 的引用。 presenter classes 持有对 view classes 的引用。
我们的view类其实就是通常由Activity/Fragment实现的接口。这意味着 Activity/Fragment -> presenter
和 presenter -> view (an Activity/Fragment)
之间存在循环依赖。出于这个原因,我们让 presenter
持有对 view (Activity/Fragment)
.
今天我们需要在同一个 Activity
中使用 2 个 views(以显示不同的模型数据),所以我们没有 implements
在 Activity
但创建了 2 个匿名 class。这最终导致 presenter
丢失了 view
的引用(因为它是一个弱引用)。
现在我们正在评估 2 个可能性:
- 我们真的不需要
presenters
在View
上保存WeakReference
因为这种类型的循环依赖不会泄漏内存。 - 我们没有使用匿名 classes,而是在
Activity
上持有一个引用(因此演示者和 activity 都有对视图的引用)只是为了为了它没有被释放(感觉很臭)。
是哪个,需要presenter持有view作为弱引用吗?
答案是 1 - 在这种情况下,演示者中不需要 WeakReference。我成功地使用了相同的模式。没有发生内存泄漏 - 当 activity 被 GC 时,演示者随之而来。但是可能还有其他类型的问题 - 如果您在某个地方(例如在 AsyncTask 中)保留对演示者的硬引用。
正如 Galya 已经指出的,在 Presenter
上不需要 WeakReference
,因为它会在 Activity
被销毁时被销毁。但是如果我正确理解你的问题,你可以尝试 "fix" MVP 模式。也许 VIPER 模式可以帮助您?