我正在从Codelab学习“生命周期感知组件”,这是从Chronometer示例开始的。在步骤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()方法,该方法应开始计时码表的计数。
疑问:
如果我们在应用程序的生命周期内仅调用一次set方法,而不在Activity内调用一次,那么从 else 部分可以看到,Long变量mStartTime的值是如何更新的,我们是否将计时器的底数设置为变量。 start()返回的值与该变量无关,因此,每秒一次又一次调用 setTime()函数的方式。
答案 0 :(得分:0)
如果在应用程序的生命周期中仅调用一次set方法,而不是Activity,则调用
ViewModel
在配置更改中保留下来。 ViewModel
取决于活动而不是应用程序生命周期。当您的活动被销毁(不更改配置)时,您的ViewModel
也将被销毁。对于您的情况,不能保证您在App Lifecycle中仅调用一次setStartTime
方法。
Long变量mStartTime的值如何更新
在这里,如果您的ViewModel
仍然有效,则可以通过chronometerViewModel.getStartTime()
并通过设置计时码表基准时间来获得Chronometer
的前一个基准时间。
如何一次又一次地调用setTime()函数
setTime()
自动每秒更新一次显示时间。您不必每秒呼叫Chronometer
。 ViewModle
自己负责更新。您只需设置他应该开始的基准时间。
最后,如果为配置而销毁的“活动”更改了,您的{{1}}仍将保留先前的数据,您可以使用该数据,这样就无需再次创建该数据。
答案 1 :(得分:0)
Check this official code lab link and on step 2 read what's at bottom of page
-视图模型仅链接到“活动/片段”生命周期! -并不是要长期坚持下去
SystemClock.elapsedRealtime()
必须被调用一次,当您拨打start()
希望这可以消除您的疑问,您可以查看Google官方文档here来检查计时器的工作原理。