【问题标题】:Pass Application or ApplicationContext to ViewModel?将 Application 或 ApplicationContext 传递给 ViewModel?
【发布时间】:2020-02-08 22:04:33
【问题描述】:

我有一个小问题。 我正在开发一个 Android 应用程序,我正在使用 MVVM 设计模式。

我需要将应用程序上下文传递给一些 ViewModel 和存储库,因为如下操作:实例化房间数据库、播放声音文件、将小数据保存到共享首选项中。我使用依赖注入做到了这一点。

我知道Application Context只有一个实例,所以如果我通过它就不会发生内存泄漏,不像Activity Contexts。

这是我的不明确之处:我发现传递 ApplicationContext(上下文实例)有效,但应用程序(应用程序实例)也有效。这两个选项有什么区别?哪个更适合作为参数传递?

【问题讨论】:

  • 您不应直接将 ApplicationContext 或 Application 实例传递给 ViewModel。将抽象传递给 ViewModel (f.i. ISoundProvider),其实现将获得 ApplicationContext 或 Application 实例。

标签: android mvvm android-context


【解决方案1】:

Application 对象getApplicationContext() 返回的对象实际上是同一个对象

如果您将AndroidViewModel 与默认工厂一起使用,您将获得一个适合用作ContextApplication 对象(如Application 扩展Context)。

【讨论】:

  • 公平地说,我怀疑 OP 对Activity 上的getApplication()getApplicationContext() 的可用性感到困惑(后者继承自Context)。我敢肯定,在 12 多年前,我们最终会在那里进行重复是有原因的...... :-)
  • @CommonsWare - Activity 扩展了 Context,因此它继承了 getApplicationContext()。它返回 Context 而不是 Application 的事实主要是由于备份/恢复的时间窗口很小(这与 ViewModel 或活动无关),其中这些 不同.因此,获取 Application 对象在 Activity 的上下文中可能更有用,这与您为 AndroidViewModel 获取 Application 的原因相同。
  • 感谢您澄清差异!可能还有更多,因为备份/恢复在 API Level 1 IIRC 中不是一个东西。但我从未听说过getApplicationContext() 没有 返回Application 单例的情况,所以很高兴知道!
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2012-05-13
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多