我是从Codelab学习生命周期感知组件的,这是从Chr测时的例子开始的。在第二步,我有一个疑问。这些是供参考的代码文件。
ChronoActivity2.java
package com.example.android.lifecycles.step2;
import android.arch.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.widget.Chronometer;
import com.example.android.codelabs.lifecycle.R;
public class ChronoActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// The ViewModelStore provides a new ViewModel or one previously created.
ChronometerViewModel chronometerViewModel
= ViewModelProviders.of(this).get(ChronometerViewModel.class);
// Get the chronometer reference
Chronometer chronometer = findViewById(R.id.chronometer);
if (chronometerViewModel.getStartTime() == null) {
// If the start date is not defined, it's a new ViewModel so set it.
long startTime = SystemClock.elapsedRealtime();
chronometerViewModel.setStartTime(startTime);
chronometer.setBase(startTime);
} else {
// Otherwise the ViewModel has been retained, set the chronometer's base to the original
// starting time.
chronometer.setBase(chronometerViewModel.getStartTime());
}
chronometer.start();
}
}ChronometerViewModel.java
package com.example.android.lifecycles.step2;
import android.support.annotation.Nullable;
import android.arch.lifecycle.ViewModel;
/**
* A ViewModel used for the {@link ChronoActivity2}.
*/
public class ChronometerViewModel extends ViewModel {
@Nullable
private Long mStartTime;
@Nullable
public Long getStartTime() {
return mStartTime;
}
public void setStartTime(final long startTime) {
this.mStartTime = startTime;
}
}在上面的代码中,我们只在第一次创建setTime()时调用ViewModel (),即在完全关闭之后启动应用程序。只有setTime()方法应该更新长变量mStartTime。在activity的末尾,我们调用了 start ()方法,该方法应该开始对Chr测时计的计数。
怀疑:
如果我们只在应用程序的生命周期中调用set方法一次,而不是活动,那么长变量mStartTime的值是如何更新的,就像我们从部件中看到的那样,如果我们将Chronometer的基设为变量。start()返回的值与变量无关,因此setTime()函数是如何一次又一次地被调用的。
发布于 2018-07-08 03:25:48
如果我们只在应用程序生命周期内调用set方法一次,而不是在活动期间调用set方法
ViewModel在配置变化中生存下来。ViewModel依赖于活动,而不是应用生命周期。当您的活动被破坏(没有配置更改)时,您的ViewModel也将被销毁。对于您的情况,不能保证您在AppLifecycle中只调用了一次setStartTime方法。
长变量mStartTime的值是如何更新的
在这里,如果您的ViewModel仍然活着,那么您将通过此方法通过chronometerViewModel.getStartTime()获得以前的基准时,并设置计时基准时间。
如何一次又一次地调用setTime()函数
Chronometer每秒钟自动更新显示时间。你不必每秒钟都打电话给setTime()。Chronometer负责自己的更新。你必须设定一个他应该开始的基本时间。
最后,如果您的活动因配置更改而被破坏,您的ViewModle仍将保存以前的数据,您可以使用该数据,这样您就不需要重新创建该数据了。
发布于 2018-07-08 04:15:45

-视图模型仅链接到活动/片段生命周期!-它不是用于长期持久性的

SystemClock.elapsedRealtime()时,必须调用,和天文钟处理从该基准时间开始的计数。希望这能消除你的疑虑,你可以检查官方谷歌文档这里来检查计时器是如何工作的。
https://stackoverflow.com/questions/51228503
复制相似问题