在一项活动中,我宣布了一个天文台
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实际上恢复了。
答案 0 :(得分:1)
答案 1 :(得分:0)
您的ChronometerViewModel(作为ViewModel的孩子)不会因为Activity的方向更改而被破坏。
ViewModel是一个负责准备和管理的类 活动或片段的数据。它也处理 活动/片段与其他人的沟通 应用程序(例如,调用业务逻辑类)。
始终与范围(片段)关联创建ViewModel 或者活动)并且只要范围有效就会保留。 例如。如果它是一个活动,直到它完成。
换句话说,这意味着如果ViewModel不会被销毁 其所有者因配置更改(例如轮换)而被销毁。该 所有者的新实例将重新连接到现有的 视图模型。
我建议您阅读ViewModel的文档:https://developer.android.com/reference/android/arch/lifecycle/ViewModel.html