android - 我需要为循环依赖使用 Wea​​kReference 吗?

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

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

快速信息:

  • Presenter 处理逻辑、网络调用等。
  • Views 负责在屏幕上显示数据、显示加载栏等。

Activity/Fragment 类持有对presenter 的引用。 presenter 类持有对 view 类的引用。

我们的view类其实就是通常由Activity/Fragment实现的接口(interface)。这意味着 Activity/Fragment -> presenterpresenter -> view(一个 Activity/Fragment) 之间存在循环依赖。出于这个原因,我们让 presenter 持有对 view (Activity/Fragment)weak reference

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

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

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

是哪个,我们需要presenter持有view作为weak reference吗?

最佳答案

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

关于android - 我需要为循环依赖使用 Wea​​kReference 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37490868/

相关文章:

java - 设置自定义 ListView 图像时出错

c - 在循环中为结构内的结构分配内存

objective-c - NSString stringwithFormat 内存泄漏与 ARC

c++ - Valgrind 泄漏检测返回段错误

Android/Linux 文件权限问题

java - 从 JSON Web 服务检索 android 中的 byte[]

javascript - 在 Javascript 中存储 JSON 响应的大小

java - Jasper报告内存泄漏

android - 如何实现圆角表格?

objective-c - 分配内存