无法让coundown计时器在我的程序中工作或显示

时间:2017-08-18 13:15:56

标签: android textview countdowntimer do-loops

我是一个较新的程序员,这是我的第一个项目但是我在使用三个应该一个接一个地运行的定时器进行正确循环时遇到了一些麻烦。我设法让对象保持它们应该在循环中的值,但由于某种原因,计时器没有像文本字段那样显示。

          startBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("mTimer:", String.valueOf(mTimer));
            Log.i("mReps:", String.valueOf(mReps));
            Log.i("Flexion:", String.valueOf(flexionTimer));
            Log.i("Hold:", String.valueOf(holdTimer));
            Log.i("Extension:", String.valueOf(extensionTimer));

            for (int iter = 0; iter < mReps; iter++) {
                Log.i("Loop:", String.valueOf(iter));

                final Timer workingFlexionTimer = new Timer();
                workingFlexionTimer.schedule(new TimerTask() {
                    int counter = ((int) flexionTimer / 1000);
                    @Override
                    public void run () {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                mPhase.setText("Flexion");
                                mCountDownTimer.setText("" + String.format(String.valueOf(counter + 1)));
                            }
                        });
                        if (counter-- == 0) {
                            workingFlexionTimer.cancel();
                        }
                    }
                }, 0, 1000);


                final Timer workingHoldTimer = new Timer();
                workingHoldTimer.schedule(new TimerTask() {
                    int counter = ((int) holdTimer / 1000);
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                mPhase.setText("Hold!!!");
                                mCountDownTimer.setText("" + String.format(String.valueOf(counter + 1)));
                            }
                        });
                        if (counter-- == 0) {
                            workingHoldTimer.cancel();
                        }
                    }
                }, flexionTimer, 1000);

                final Timer workingExtensionTimer = new Timer();
                workingExtensionTimer.schedule(new TimerTask() {
                    int counter = ((int) extensionTimer / 1000);
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                mPhase.setText("Extension");
                                mCountDownTimer.setText("" + String.format(String.valueOf(counter + 1)));
                            }
                        });
                        if (counter-- == 0) {
                            workingExtensionTimer.cancel();
                        }
                    }
                }, (flexionTimer + holdTimer), 1000);
            }

我现在有点不知所措,任何建议都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

使用处理程序


    private void Timer() {
        handler = new Handler();
        Run =new Runnable() {
        @Override
        public void run() { //Do something after 10 sec
        Toast.makeText(getActivity(), "Timer called!",Toast.LENGTH_LONG).show();
        Timer(); // Do again                
        }};
        handler.postDelayed(Run , 10000);  // 10 sec
    }

答案 1 :(得分:0)

第一个计时器 flexionCountDownTimer 在循环中启动,这意味着如果 mReps 大于1,它将启动多次。这可能会导致第二次运行在第一次运行完成之前, flexionCountDownTimer 。这是你预期的行为吗?

答案 2 :(得分:0)

<强>更新

对于我经常做的计时器:

    final TextView textView = (TextView)findViewById(R.id.textView);
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        int counter = 10;
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(""+counter);
                }
            });

            if (counter-- == 0){
                timer.cancel();
            }

        }
    }, 0, 1000);

timer.schedule(new TimerTask() {
        int counter = 10;
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(""+counter);
                }
            });

            if (counter-- == 0){
                timer.cancel();
            }

        }
    }, 10000, 1000);


timer.schedule(new TimerTask() {
        int counter = 10;
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(""+counter);
                }
            });

            if (counter-- == 0){
                timer.cancel();
            }

        }
    }, 20000, 1000);

了解更多信息check this

在链接中......

  

public void schedule(TimerTask任务,长延迟,长时间)

以上代码。立即启动 run()

long delay = 0;// in ms
long period = 1000;// in ms

所以每1000ms调用 run()和counter--。当counter = 0时取消。

如果你想要一个接一个地跑,就把延迟。

<强>更新

现在第一个将立即运行,第二个将等待10000毫秒(10秒)并将运行,最后第三个将等待20000毫秒(20秒)然后运行。