11

我正在研究 google 的架构组件以在我的应用程序中实现 ViewModel 和 LiveData,官方文档说:

注意:由于 ViewModel 比特定的 Activity 和 Fragment 实例的寿命更长,它不应该引用 View 或任何可能持有对 Activity 上下文的引用的类。如果 ViewModel 需要 Application 上下文(例如,寻找系统服务),它可以扩展 AndroidViewModel 类,并在构造函数中有一个接收 Application 的构造函数(因为 Application 类扩展了 Context)

之后,我最终得到了这样的代码:

public class ViewModelTest extends AndroidViewModel {

public ViewModelTest(Application application) {
    super(application);
}

public void test(){
    Prefs.getCurrentCode(getApplication());
}

我应该在活动中正常实例化它吗?

  val viewModel2 = ViewModelProviders.of(this).get(ViewModelTest::class.java)
    viewModel2.test()

不是很糟糕吗?在需要访问 SharedPreferences 或任何需要上下文的东西时使用此应用程序变量?如果是,我是否应该避免在 ViewModel 上使用它而只在视图上使用它?特别是如果我想用需要上下文的值更新 UI 组件。我有点不知道如何解决这个问题,我愿意接受任何建议。

提前致谢

4

1 回答 1

6

AndroidViewModel 类作为 android.arch.lifecycle 包的一部分提供,该包是 Android 架构组件的一部分。它本身调用传递给构造函数的应用程序上下文。应用程序上下文存在于 Activity 生命周期中。

ViewModel 中的 Application 上下文是可以的,因为 Application 上下文与整个 Application 生命周期相关联,而 Activity 上下文则与 Activity 生命周期相关联。

ViewModel 文档具体指的是不使用 Activity 上下文,但如果可以的话,可以使用 Application Context。

于 2018-04-05T17:37:49.903 回答