【问题标题】:Why do we use Application Context in Constructors in Android?为什么我们在 Android 的构造函数中使用应用程序上下文?
【发布时间】:2019-07-26 07:20:48
【问题描述】:

在使用 Room Database 时,我发现 Repository 和 ViewModel 等类在其构造函数中使用 Application Context 作为参数。

我只是想知道原因,为什么要这样做? 使用应用程序上下文是一种强迫行为吗?

public WordViewModel (Application application) {
   super(application);
   mRepository = new WordRepository(application);
   mAllWords = mRepository.getAllWords();
}

 WordRepository(Application application) {
   WordRoomDatabase db = WordRoomDatabase.getDatabase(application);
   mWordDao = db.wordDao();
   mAllWords = mWordDao.getAllWords();

}

想知道这些东西背后的原因

【问题讨论】:

  • 您对图书馆的内部运作感兴趣。那挺好的。也就是说,在问这个问题之前,您是否已经查看了源代码中的文档? (编辑:您可以在 Android Studio 中按住 alt+click 一个函数来导航到源代码)
  • 如果这个问题很好,为什么它很沮丧???

标签: android android-room


【解决方案1】:
  1. 为什么我们不能使用活动上下文?

注意:ViewModel 绝不能引用视图、生命周期或任何可能持有对活动上下文的引用的类。

ViewModel 对象旨在比视图或 LifecycleOwners 的特定实例化更长寿。这种设计还意味着您可以更轻松地编写测试来覆盖 ViewModel,因为它不了解视图和生命周期对象。

  1. 为什么我们可以使用应用程序上下文?

如果 ViewModel 需要 Application 上下文,例如查找系统服务,它可以扩展 AndroidViewModel 类,并在构造函数中有一个接收应用程序的构造函数,因为 Application 类扩展了上下文。

ViewModel

【讨论】:

    【解决方案2】:

    让我懒惰地回答这个问题。应用程序上下文生命周期与应用程序的生命周期相关联,而活动上下文与该活动的生命周期相关联。确保使用正确的上下文来防止内存泄漏。希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 2014-07-01
      • 2011-05-06
      • 2018-02-19
      • 2018-01-23
      • 1970-01-01
      相关资源
      最近更新 更多