【问题标题】:How ViewModel state is automatically updatedViewModel 状态如何自动更新
【发布时间】:2017-12-19 22:35:24
【问题描述】:

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

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();

ViewModel 类

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

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

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

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

我正在关注这个 google 的 codelabs tutorial

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

【问题讨论】:

  • 运行应用程序(在运行配置下拉菜单中选择第 2 步)
  • ChronometerViewModel 对象的 startTime 如何随计时器时间更新。我没有看到设置 ChronometerViewModel .setStartTime 方法的代码。@Akhil, @Serj

标签: android viewmodel android-architecture-components


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您的 ChronometerViewModel(作为 ViewModel 的子级)不会随着 Activity 的方向变化而被破坏。

    ViewModel 是一个负责准备和管理的类 Activity 或 Fragment 的数据。它还处理 Activity / Fragment 与其余部分的通信 应用程序(例如调用业务逻辑类)。

    一个 ViewModel 总是与一个范围(一个片段 或活动),只要范围存在,就会被保留。 例如。如果是Activity,直到完成。

    换句话说,这意味着 ViewModel 不会被销毁,如果 其所有者因配置更改(例如轮换)而被销毁。这 所有者的新实例将重新连接到现有的 视图模型。

    我建议你阅读 ViewModel 的文档:https://developer.android.com/reference/android/arch/lifecycle/ViewModel.html

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多