LifeCycle Aware Codelab概念

时间:2018-07-08 02:58:04

标签: android android-lifecycle android-architecture-components android-architecture-lifecycle

我正在从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()函数的方式。

2 个答案:

答案 0 :(得分:0)

  

如果在应用程序的生命周期中仅调用一次set方法,而不是Activity,则调用

ViewModel在配置更改中保留下来。 ViewModel取决于活动而不是应用程序生命周期。当您的活动被销毁(不更改配置)时,您的ViewModel也将被销毁。对于您的情况,不能保证您在App Lifecycle中仅调用一次setStartTime方法。

  

Long变量mStartTime的值如何更新

在这里,如果您的ViewModel仍然有效,则可以通过chronometerViewModel.getStartTime()并通过设置计时码表基准时间来获得Chronometer的前一个基准时间。

  

如何一次又一次地调用setTime()函数

setTime()自动每秒更新一次显示时间。您不必每秒呼叫ChronometerViewModle自己负责更新。您只需设置他应该开始的基准时间。

最后,如果为配置而销毁的“活动”更改了,您的{{1}}仍将保留先前的数据,您可以使用该数据,这样就无需再次创建该数据。

答案 1 :(得分:0)

Your Doubt regarding the persistence is answered here!

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

-视图模型仅链接到“活动/片段”生命周期!  -并不是要长期坚持下去

Your Doubt regarding whether the <code>SystemClock.elapsedRealtime()</code> is called again and again is answered here

  • 基准时间只是一个参考,天文钟必须从中进行计时,而基准一次则需要设置
  • SystemClock.elapsedRealtime()必须被调用一次,当您拨打start()
  • 时,天文钟会处理从该基准时间开始的计数

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