专栏首页Android 开发者[译]区域设置更改和 AndroidViewModel 反面模式

[译]区域设置更改和 AndroidViewModel 反面模式

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));
    }
}
复制代码

问题的关键是字符串在构造器中只解释一次。如果有区域设置更改,则不会重新创建视图模型。这将导致我们的应用程序显示废弃的数据,因此只能部分本地化。

正如 Sergey 在评论中指出的那样 comments,推荐的方法是公开要加载的资源的 ID ,并在视图中这样做。由于视图(活动、片段等)具有生命周期意识,因此它将在配置更改后重新创建,以便正确地重新加载资源。

// 显示资源ID
public class MyViewModel extends ViewModel {
    public final MutableLiveData<Int> statusLabel = new MutableLiveData<>();
    
    public SampleViewModel(Application context) {
        super(context);
        statusLabel.setValue(R.string.labelString);
    }
}
复制代码

即使你不打算本地化你的应用程序,它也会使测试变得更容易并且清空你的 ViewModel 对象,因此没有理由不去考虑它的前瞻性。

我们在以 Java 为基础的 Android 架构存储库中解决了这个问题 Java 以及在Kotlin 分支上。我们也把资源转移到 数据绑定布局

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ViewModel 和 LiveData:为设计模式打 Call 还是唱反调?

    Android 开发者
  • ViewModels 简单入门

    Android 开发者
  • 架构组件之 ViewModel | 中文教学视频

    Android 开发者
  • QML画三角形代码

    Qt君
  • Metasploit5相关知识

    最近,rapid官方对Metasploit进行了大的框架升级,从原来的4.x系列升级到了5版本。今天,我们来看一下MSF5的相关知识点。

    墙角睡大觉
  • 如何用活字格定制监狱管理系统

    监狱是国家司法机关的重要组成部分,监狱管理的信息化对整个监区罪犯管理、执法管理、监控管理等核心功能具有非常高的要求。通过活字格Web应用平台定制的监狱管理系统,...

    葡萄城控件
  • python获取windows下所有盘符

    用户2398817
  • FAT(Fast-AutoTest) —专业服务于微信H5/小程序UI自动化测试

    随着项目的发展,许多项目中H5(特别是微信平台内)以及小程序占比逐渐增多,因此快速建设相关的自动化来提高项目的效率和质量成为了许多项目中的重中之重。

    腾讯移动品质中心TMQ
  • 从Seq2seq到Attention模型到Self Attention(一)

    近一两年,注意力模型(Attention Model)是深度学习领域最受瞩目的新星,用来处理与序列相关的数据,特别是2017年Google提出后,模型成效、复杂...

    量化投资与机器学习微信公众号
  • 只此一家!腾讯自动驾驶拿下深圳路测牌照

    腾讯大讲堂

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动