Android架构组件ViewModel上下文

11

我正在学习谷歌的架构组件,以将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());
}

我应该在Activity上正常实例化它吗?

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

使用这个应用程序变量来访问SharedPreferences或其他需要上下文的内容是不好的,对吗?如果是这样的话,我应该避免在ViewModel中使用它,并仅在视图中使用它吗?特别是如果我想使用需要上下文的值更新UI组件。我有点不知道如何解决这个问题,欢迎任何建议。

提前致谢。


2
我没有看到问题。https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String, int) 和 https://dev59.com/uXNA5IYBdhLWcg3wX8rk?rq=1 - Raghunandan
1
“这不是很糟糕吗?”——为什么?“需要访问SharedPreferences或任何需要上下文的东西时,使用此应用程序变量?”——你还有什么建议吗?几乎所有本地数据存储都围绕着“Context”展开。对于非UI工作(例如处理本地数据存储),使用“Application”作为“Context”是相当安全的选择。 - CommonsWare
这正是我的问题,如果使用Application类作为安全上下文的方法是否可行,因为我一直听说使用“本地”上下文或活动上下文是更好的做法。 对我来说看起来还不错,但在着手之前我想要更多意见,谢谢@CommonsWare,顺便说一句,我很喜欢你的书,我有所有三本关于Android的。 - julioribeiro
你可能会对 Dave Smith 关于不同 Context 对象的角色的经典博客文章 感兴趣。我很高兴能为你提供帮助! - CommonsWare
谢谢,这将非常有帮助! - julioribeiro
1个回答

6

AndroidViewModel类是Android架构组件(android.arch.lifecycle)的一部分。该类本身需要在其构造函数中传递应用程序上下文(Application Context)。应用程序上下文存在于Activity生命周期之外。

在ViewModel中使用应用程序上下文是可以的,因为应用程序上下文与整个应用程序生命周期相关联,而Activity上下文则与Activity生命周期相关联。

ViewModel文档特别指出不要使用Activity上下文,而使用应用程序上下文就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接