LifeCycle Aware Codelab 概念

LifeCycle Aware Codelab Concept

我正在从 Chronometer 示例开始的 Codelab 学习生命周期感知组件。在第 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;
    }
}

在上面的代码中,我们只调用了一次 setTime(),并且只有在第一次创建 ViewModel 时,即启动应用程序时完全关闭后。并且只有 setTime() 方法应该更新 Long 变量 mStartTime。在 activity 文件的末尾,我们正在调用 start() 方法,该方法应该开始计时计的计数。

疑问:

如果我们在应用程序的生命周期内只调用一次 set 方法而不是 Activity,Long 变量 mStartTime 的值是如何更新的,正如我们可以从 else 部分,我们是否将 Chronometer 的基数设置为变量。 start() 返回的值与变量没有任何关系,所以 setTime() 函数是如何被一次又一次调用的每秒。

If we are calling the set Method only once during the Life of the app and not Activity

ViewModel 在配置更改中存活。 ViewModel 取决于 Activity 而不是 App Lifecycle。当您的 Activity 销毁(没有配置更改)时,您的 ViewModel 也将被销毁。对于您的情况,不能保证您在 App Lifecycle 中仅调用一次 setStartTime 方法。

how does the value of the Long variable mStartTime is being updated

在这里,如果您的 ViewModel 还活着,那么您将通过此方法 chronometerViewModel.getStartTime() 获取之前的基准时间并设置天文钟基准时间。

how the setTime() function is being called again and again every second

Chronometer 每秒自动更新显示时间。您不必每秒调用 setTime()Chronometer 自行处理更新。你只需要设置一个他应该开始的基准时间。

最后,如果您的 Activity 因配置更改而销毁,您的 ViewModle 仍将保留以前的数据,您可以使用它,这样您就不需要再次重新创建该数据。

Check this official code lab link and on step 2 read what's at bottom of page

- 视图模型仅链接到 Activity/Fragment 生命周期! - 这并不意味着长期坚持

  • 基准时间只是一个参考[​​=32=],天文台表必须从中计算,需要设置一次
  • SystemClock.elapsedRealtime() 必须 调用一次 并且当您调用 start()
  • 时计时器会处理从该基准时间开始的计数

希望这能消除您的疑虑,您可以查看官方 google 文档 here 来检查计时器的工作原理。