我正在从 Chronometer 示例开始的 Codelab 中学习 Lifecycle Aware Components。在第 2 步中,我有疑问。这些是供参考的代码文件
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;
}
}
在上面的代码中,我们只在第一次创建 ViewModel 时调用setTime() ,即在完全关闭后启动应用程序时。只有setTime()方法应该更新 Long 变量mStartTime。在活动文件结束时,我们调用start()方法,该方法应该开始计时码表的计数。
怀疑:
如果我们在应用程序的生命周期而不是 Activity 期间只调用一次 set 方法,从else部分可以看出,Long 变量 mStartTime 的值是如何更新的,我们是否将 Chronometer 的基础设置为变量。start()返回的值与变量没有任何关系,因此setTime()函数如何每秒一次又一次地被调用。