【问题标题】:Do I need to use a WeakReference for circular dependency?我是否需要使用 Wea​​kReference 进行循环依赖?
【发布时间】:2016-05-27 19:20:16
【问题描述】:

我们在这里谈论的是 Android。我们使用 Model-View-Presenter 方法对我们的架构进行了建模,但遇到了一个关于weak references的问题。

快速信息:

  • Presenter 处理逻辑、网络调用等
  • 视图句柄在屏幕上显示数据、显示加载条等。

Activity/Fragment 类包含对 presenter 的引用。 presenter 类包含对 view 类的引用。

我们的 view 类实际上是通常由 Activity/Fragment 实现的接口。这意味着Activity/Fragment -> presenterpresenter -> view (an Activity/Fragment) 之间存在循环依赖关系。出于这个原因,我们让presenter 持有对view (Activity/Fragment)弱引用

今天我们需要在同一个 Activity 中使用 2 个 views(显示不同的模型数据),所以我们没有在 Activity 上使用 implements 它,而是创建了 2 个匿名班级。这最终导致presenter 丢失了view 的引用(因为它是一个弱引用)。

现在我们正在评估 2 个可能性:

  1. 我们真的不需要presentersView 上保存WeakReference,因为这种类型的循环依赖不会泄漏内存。
  2. 我们没有使用匿名类,而是在Activity 上保存了一个引用(因此演示者和活动都有一个对视图的引用)只是为了它不会被释放(感觉很臭)。

是哪一个,我们需要presenter将视图作为弱引用吗?

【问题讨论】:

    标签: android memory-management memory-leaks weak-references


    【解决方案1】:

    答案是 1 - 在这种情况下,您不需要在演示者中使用 Wea​​kReference。我成功地使用了相同的模式。不会发生内存泄漏 - 当活动被 GCed 时,演示者会随之而来。但可能还有其他类型的问题 - 如果您在某处(例如在 AsyncTask 中)保留对演示者的硬引用。

    【讨论】:

      【解决方案2】:

      正如 Galya 已经指出的那样,在 Presenter 上不需要 WeakReference,因为它会在 Activity 被销毁时被销毁。但是,如果我正确理解您的问题,您会尝试“修复”MVP 模式。也许VIPER 模式可以帮助您?

      【讨论】:

        猜你喜欢
        • 2020-05-21
        • 2018-11-02
        • 2021-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多