android - ViewModel 状态如何自动更新

标签 android viewmodel android-architecture-components

在一个 Activity 中,我声明了一个计时器

Chronometer chronometer = findViewById(R.id.timer);

ChronometerViewModel viewModel = ViewModelProviders.of(this).get(ChronometerViewModel.class);
if (viewModel.getStartTime() == null) {
   long startTime = SystemClock.elapsedRealtime();
        viewModel.setStartTime(startTime);
        chronometer.setBase(startTime);
    } else {
        chronometer.setBase(viewModel.getStartTime());
    }
 chronometer.start();

View 模型类

public class ChronometerViewModel extends ViewModel {
  @Nullable
  private Long mStartTime;

  @Nullable
  public Long getStartTime() {
    return mStartTime;
  }

  public void setStartTime(final long startTime) {
    this.mStartTime = startTime;
  }
}

当我旋转屏幕时,chronometer 会自动从之前的状态恢复。但是我没有编写任何代码来在配置更改时将计时器的当前状态存储到 ViewModel 类。状态是如何自动恢复的?

我正在关注这个谷歌的代码实验室 tutorial

编辑:我对 Chronometer 的 setBase 方法感到困惑。我假设我的状态变量 mStartTime 会自动更新为 Chronometer 小部件中显示的当前时间。现在我已经检查了 setBase 方法的文档。由于 mStartTime 在配置更改时持续存在,我们可以使用 Chronometer 启动时的旧值。所以 Chronometer 实际上恢复了。

最佳答案

ViewModel 生命周期 如下所示,Android 出于同样的目的引入它,以便它可以在配置更改后继续存在并且在 Activity 完成 之前不会丢失状态。 p>

顺便说一句,您是否因为这种行为而面临任何问题?

ViewModel lifecycle

关于android - ViewModel 状态如何自动更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47872504/

相关文章:

android - 如何使用导航组件在单个 fragment 上正确添加选项菜单而不破坏 "up behavior"

android - 如何在启用安全参数的不同导航图中重用 fragment ?

android - 我应该在 MVVM 中的哪里链接多个网络请求?存储库的用例?

java - 如何实现 TabLayout 的选项卡从左或右开始,但不是从中心开始?

Android logcat "application"列始终为空

MVVM View 事件 Viewmodel 命令绑定(bind)

mvvm - Knockout.js:一个页面或页面的一部分上的多个 ViewModel 绑定(bind)

android - 当我尝试在 ubuntu 上的 Android Studio 上运行模拟器时出现 "PANIC: Could not find..."

android - 尝试将 Android Gradle 项目从 Groovy 迁移到 Kotlin 时出现 CacheOpenException

javascript - vue.js - 组织具有多个 View 的大型单页应用程序