android - 生命周期感知 Codelab 概念
问题描述
我正在从 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()函数如何每秒一次又一次地被调用。
解决方案
检查此官方代码实验室链接,并在第 2 步中阅读页面底部的内容
- 视图模型仅链接到活动/片段生命周期!- 这并不意味着长期坚持
- 基准时间只是计时器必须从中计数的参考,需要设置一次
SystemClock.elapsedRealtime()
必须调用一次,当您调用时,计时器会处理从该基准时间开始计数start()
希望这可以消除您的疑虑,您可以在此处查看官方谷歌文档以检查计时器的工作原理。
推荐阅读
- python - 为什么 os.path.join 返回带有 2 个斜杠的结果?
- java - lambda 表达式中的错误返回类型:Model1 无法转换为 Model2
- node.js - nodejs fluent-ffmpeg 进程太慢
- php - 获取一个数据数组并将所有数据附加到另一个数组?
- correlation - 使用名义关联函数获取错误“无法在具有新类别的分类上设置项目,首先设置类别”
- azure-functions - Azure Functions 中的 CosmosDB 输出绑定错误
- javascript - 如何处理用于 Google 登录的 CSRF?(使用 Python 和 Django)
- c - C,Linux中子进程的复杂键盘输入
- terraform - Terraform 合规性:如何检查我的 GCP 资源是否具有带有给定密钥的标签?
- shell - 超级终端:zsh:找不到命令:hyper