- 原文地址: Locale changes and the AndroidViewModel antipattern
- 原文作者: Jose Alcérreca
- 译文出自: 掘金翻译计划
- 本文永久链接: github.com/xitu/gold-m…
- 译者: solerji
TL;DR:从视图模型中公开资源 ID 以避免显示废弃的数据。
在 ViewModel 中,如果要公开来自资源(字符串、可绘制文件、颜色……)的数据,则必须着重考虑 ViewModel 对象而忽视配置更改,例如 区域设置更改 。当用户更改其区域设置时,活动将重新被创建,但不创建 ViewModel 对象。
AndroidViewModel
是已知应用程序上下文的
ViewModel
的子类。然而,如果您没有注意到或没有对上下文的生命周期做出反应,访问上下文可能是危险的。
建议的做法是避免处理在 ViewModels 中具有生命周期的对象。
让我们看看跟踪器中基于此问题的示例: 在系统区域设置更改时更新 ViewModel 。
// 别这么做
public class MyViewModel extends AndroidViewModel {
public final MutableLiveData<String> statusLabel = new MutableLiveData<>();
public SampleViewModel(Application context) {
super(context);
statusLabel.setValue(context.getString(R.string.labelString));
}
}
复制代码
问题的关键是字符串在构造器中只解释一次。 如果有区域设置更改,则不会重新创建视图模型 。这将导致我们的应用程序显示废弃的数据,因此只能部分本地化。