ViewModel状态如何自动更新

时间:2017-12-18 16:25:38

标签: android viewmodel android-architecture-components

在一项活动中,我宣布了一个天文台

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类。状态如何自动恢复?

我正在关注此谷歌的代码tutorial

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

2 个答案:

答案 0 :(得分:1)

ViewModel生命周期如下所示,Android为了相同的目的引入了它,因此它可以在配置更改后继续存在并且在活动完成之前不会松散状态

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

ViewModel lifecycle

答案 1 :(得分:0)

您的ChronometerViewModel(作为ViewModel的孩子)不会因为Activity的方向更改而被破坏。

  

ViewModel是一个负责准备和管理的类   活动或片段的数据。它也处理   活动/片段与其他人的沟通   应用程序(例如,调用业务逻辑类)。

     

始终与范围(片段)关联创建ViewModel   或者活动)并且只要范围有效就会保留。   例如。如果它是一个活动,直到它完成。

     

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

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