【问题标题】:Why does timer loop not initialize at initial value when it calls onFinish() method?为什么定时器循环在调用 onFinish() 方法时没有初始化为初始值?
【发布时间】:2018-04-12 22:03:45
【问题描述】:

我想构建一个 5 秒计时器,它在 1 秒间隔内倒计时到 0,然后重置为 5 秒的初始值。计时器需要连续运行。看完这个贴子, Android - loop part of the code every 5 seconds

我使用了 CountDownTimer 类并在 onFinish() 方法中调用 start() 方法,这样当计时器完成时,它会重置为 5。它确实在连续循环中运行,但是我注意到在第一个循环之后,它会倒计时为 4-3-2-1-0 或 5-3-2-1-0。 有人可以向我解释为什么会这样吗?

private long START_TIME_IN_MILLIS = 5000;
//set up our variables
private CountDownTimer timer;
private TextView textView;
private Button starttimer;
private long mTimeLeftInMillis = START_TIME_IN_MILLIS;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    textView = findViewById(R.id.text_view_countdown);
    starttimer = findViewById(R.id.button_start_pause);
    //set onclik listener when touch imput button
    starttimer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            beginTime();
        }
    });
}

//creating my own method
private void beginTime() {

    timer = new CountDownTimer(mTimeLeftInMillis, 1000) {

        @Override
        public void onTick(long millisUntilFinished) {
            mTimeLeftInMillis = millisUntilFinished;
            updateCountDownText();
        }

        @Override
        public void onFinish() {
            start();
        }

    }.start();
}

private void updateCountDownText(){
    int minutes= (int) (mTimeLeftInMillis / 1000)/ 60;
    int seconds= (int) (mTimeLeftInMillis / 1000) % 60;

    String timeLeftFormatted = String.format(Locale.getDefault(),"%02d:%02d", minutes, seconds);
    textView.setText(timeLeftFormatted);
}

}

【问题讨论】:

    标签: android


    【解决方案1】:

    试试这个

     @Override
            public void onFinish() {
              mTimeLeftInMillis = START_TIME_IN_MILLIS;
       }
    

    【讨论】:

    • 上面的代码没有改变任何东西。我尝试了下面的代码,它在从 4 @Override public void onFinish() { mTimeLeftInMillis = START_TIME_IN_MILLIS; 倒计时之前显示了 5 的初始值updateCountDownText();开始(); }
    • 哦!您可以尝试添加延迟吗?倒计时开始?
    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 2022-01-05
    • 2020-12-17
    • 1970-01-01
    • 2013-12-31
    • 2015-02-20
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多