【问题标题】:Dagger 2 Scopes, where to place Presenters?Dagger 2 Scopes,在哪里放置演示者?
【发布时间】:2017-06-08 14:48:01
【问题描述】:

将 Presenter 置于 Scope 中的最佳做法是什么?

我们可以在@Singleton 或@AppScope 上设置Presenter 没有任何问题吗?

是否应该将它们放在@Act​​ivityScope 中以便在每次销毁活动时销毁它们?

【问题讨论】:

  • 前几天我刚刚写了一个类似的答案,关于保持演示者和如何使用范围的问题,你可能想看看stackoverflow.com/a/44398997/1837367
  • 回答得很好。我目前面临一个在@Singleton 范围内有演示者的项目,我个人不喜欢它。这就是我问这个问题的原因。还有一个问题,当我们有 Scopes 时,该范围的所有提供者是否在创建范围时都已初始化?

标签: android dependency-injection dagger-2 android-mvp


【解决方案1】:

将 Presenter 置于 Scope 中的最佳做法是什么?

通常演示者应该在 some 范围内。不将它放在任何范围内都会导致问题,因为每次您请求演示者时,它都会创建一个新的演示者。

您选择哪个范围主要取决于您的编程风格,但最常见的可能是@PerActivity,作为遵循活动生命周期的范围。 (同样的方式你可以使用类似 @PerFragment 的片段及其生命周期)

我们可以在@Singleton 或@AppScope 上设置Presenter 没有任何问题吗?

是和不是。较长生命周期的对象引用较短生命周期的对象(例如,@Singleton 对象引用活动生命周期的对象)通常不是一个好的做法,可能会导致内存泄漏。

您可以通过正确添加/删除较短生命周期的对象(例如添加onCreate,删除onDestroy)或使用WeakReference来避免这些问题。

一些程序员会将他们的演示者保留为@Singleton 或以某种类似的方式并交换视图,但这同样取决于您喜欢您的代码的方式。它会起作用,但你必须确定你引用了哪些对象并在之后清理。

是否应该将它们放在@Act​​ivityScope 中以便在每次销毁活动时销毁它们?

这是迄今为止最简单的选择,因为您可以毫无问题地引用 Activity 或其他任何依赖它的东西。通过这种方式,您很可能不必担心内存泄漏或其他问题。


最后它的你的代码,你必须做最适合的事情。

【讨论】:

  • 感谢您的详细回答。我一直使用@ActivityScope 方法,这就是为什么我怀疑所有演示者都在同一范围内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多