当另一个正在运行时,如何暂停一个倒数计时器?

Posted

技术标签:

【中文标题】当另一个正在运行时,如何暂停一个倒数计时器?【英文标题】:How can I pause one CountDown Timer when another one is running? 【发布时间】:2017-02-26 21:06:21 【问题描述】:

我的程序中有两个 CountDownTimer:一个 4 秒,一个 24 秒。我希望较长的计时器每 4 秒暂停一次,较短的计时器正在运行。然后当短定时器结束时,长定时器开始倒计时。这是两个计时器的代码:

final CountDownTimer loop = new CountDownTimer(4000, 1000) 
                @Override
                public void onTick(long millisUntilFinished) 

                
                @Override
                public void onFinish() 
                    number.setVisibility(View.GONE);
                    final TextView prompt = (TextView) findViewById(R.id.prompt);
                    prompt.setVisibility(View.VISIBLE);
                    prompt.setText(" Enter the number");
                    final EditText input = (EditText) findViewById(R.id.enterAnswer);
                    input.setVisibility(View.VISIBLE);
                    input.setOnKeyListener(new View.OnKeyListener() 
                        @Override
                        public boolean onKey(View v, int keyCode, KeyEvent event) 
                            if (event.getAction() == KeyEvent.ACTION_DOWN) 
                                switch (keyCode) 
                                    case KeyEvent.KEYCODE_ENTER:
                                        Editable answer = input.getText();
                                        int finalAnswer = Integer.parseInt(String.valueOf(answer));
                                        int finalLoadG1 = Integer.parseInt(String.valueOf(number.getText()));
                                        input.setVisibility(View.GONE);
                                        prompt.setVisibility(View.GONE);
                                        if (finalAnswer == finalLoadG1) 
                                            score++;
                                        

                                        number.setVisibility(View.VISIBLE);
                                        int loadG1 = generateG1.nextInt(1000000)+10000;
                                        number.setText(""+loadG1);
                                        input.getText().clear();

                                        start();

                                        return true;
                                    default:
                                
                            
                            return false;
                        
                    );
                
                .start();


            new CountDownTimer(24000, 1000) 
                @Override
                public void onTick (long millisUntilFinished) 
                
                @Override
                public void onFinish() 
                    TextView result = (TextView) findViewById(R.id.outcome);
                    result.setText("Score: "+ score);
                    TextView prompt = (TextView) findViewById(R.id.prompt);
                    prompt.setVisibility(View.GONE);
                    final EditText input = (EditText) findViewById(R.id.enterAnswer);
                    input.setVisibility(View.GONE);
                    loop.cancel();
                    number.setVisibility(View.GONE);
                
            .start();

我考虑过命名较长的计时器,然后将 name.pause() 放在 onTick 中以获得较短的计时器。问题是,因为较长的计时器是在较短的计时器之后写入的,所以在初始化之前它的名称无法识别。 Java 是按顺序读取的,对吗?还是所有语言都这样?

如果有人可以帮助我,我将不胜感激。

作为任何能够回答的人的一个附带问题,当用户在 EditText(用于 int)上按 Enter 键以不提交任何内容时,是否有任何方法可以防止应用程序崩溃?比如,我可以让应用继续运行而不强制停止吗?

非常感谢。

【问题讨论】:

而不是new CountDownTimer,您应该创建一个扩展倒数计时器的类。然后它可以在你较短的里面访问...... 【参考方案1】:

在您的代码中创建单独的方法来启动/暂停/恢复 24 秒计时器。您需要存储您的 milliTillFinished 24 秒计时器,以便您可以将其传递给恢复计时器方法。您可以在 4 秒定时器的 onTick() 方法上暂停 24 秒定时器,并在 onFinish() 方法上恢复它。

启动计时器:

   public void timerStart(long timeLengthMilli) 
    timer = new CountDownTimer(timeLengthMilli, 1000) 

        @Override
        public void onTick(long milliTillFinish) 
            milliLeft=milliTillFinish;
        

暂停计时器:

public void timerPause() 
    timer.cancel();

要恢复计时器:

private void timerResume() 
    timerStart(milliLeft);

【讨论】:

希望这会有所帮助:) 在我的帖子中,我明确指出我不能在 4 秒内暂停或启动 24 秒计时器。下次请仔细阅读。

以上是关于当另一个正在运行时,如何暂停一个倒数计时器?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:当倒数计时器达到 0 时执行动作

如何在 kivy 中创建 60 秒倒数计时器

刷新网页时如何防止倒数计时器重置?

PowerPoint - 创建倒数计时器 - VBA

如何创建在使用 AnimationController 创建的倒数计时器期间发出的警报?

MVC 中的倒数计时器