首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LifeCycle感知Codelab概念

LifeCycle感知Codelab概念
EN

Stack Overflow用户
提问于 2018-07-08 02:58:04
回答 2查看 85关注 0票数 0

我是从Codelab学习生命周期感知组件的,这是从Chr测时的例子开始的。在第二步,我有一个疑问。这些是供参考的代码文件。

ChronoActivity2.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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()方法应该更新长变量mStartTime。在activity的末尾,我们调用了 start ()方法,该方法应该开始对Chr测时计的计数。

怀疑:

如果我们只在应用程序的生命周期中调用set方法一次,而不是活动,那么长变量mStartTime的值是如何更新的,就像我们从部件中看到的那样,如果我们将Chronometer的基设为变量。start()返回的值与变量无关,因此setTime()函数是如何一次又一次地被调用的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-08 03:25:48

如果我们只在应用程序生命周期内调用set方法一次,而不是在活动期间调用set方法

ViewModel在配置变化中生存下来。ViewModel依赖于活动,而不是应用生命周期。当您的活动被破坏(没有配置更改)时,您的ViewModel也将被销毁。对于您的情况,不能保证您在AppLifecycle中只调用了一次setStartTime方法。

长变量mStartTime的值是如何更新的

在这里,如果您的ViewModel仍然活着,那么您将通过此方法通过chronometerViewModel.getStartTime()获得以前的基准时,并设置计时基准时间。

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

Chronometer每秒钟自动更新显示时间。你不必每秒钟都打电话给setTime()Chronometer负责自己的更新。你必须设定一个他应该开始的基本时间。

最后,如果您的活动因配置更改而被破坏,您的ViewModle仍将保存以前的数据,您可以使用该数据,这样您就不需要重新创建该数据了。

票数 0
EN

Stack Overflow用户

发布于 2018-07-08 04:15:45

检查这个官方代码实验室链接,并在步骤2中阅读页面底部的内容

-视图模型仅链接到活动/片段生命周期!-它不是用于长期持久性

  • 基准时间只是一个参考,计时器必须从中计数哪些需要设置一次。
  • 当您调用SystemClock.elapsedRealtime()时,必须调用和天文钟处理从该基准时间开始的计数。

希望这能消除你的疑虑,你可以检查官方谷歌文档这里来检查计时器是如何工作的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51228503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档