【问题标题】:CountDownTimer not stopping or restartingCountDownTimer 不停止或重新启动
【发布时间】:2020-06-17 17:11:00
【问题描述】:

我正在尝试设置 dailyReward 系统,我几乎完成了,但我确实遇到了 CountDownTimer 的一些问题。因此,当 Timer 变为 0,并且您点击 claimReward 时,您将获得奖励,并且计时器应该重新开始倒计时。但问题是;如果您重新启动应用程序它会恢复正常,它确实会减去负数。

这是倒计时方法,无论我在 onFinish() 中放入什么,都不会发生任何事情

    public void loadDailyRewardCountDown() {

        CountDown = true;
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        formatter.setLenient(false);

        String endTime = getDailyRewardsDate;

        Date endDate;
        Date startDate;
        long milliseconds = 0;
        long millisec = 0;
        try {
            endDate = formatter.parse(endTime);
            startDate = formatter.parse(curDate);
            millisec = startDate.getTime();
            milliseconds = endDate.getTime();

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        long startTime = millisec;
        mCountDownTimer = new CountDownTimer(milliseconds, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {

                //startTime = startTime - 1;
                Long serverUptimeSeconds =
                        (millisUntilFinished - startTime) / 1000;

                //String daysLeft = String.format("%d", serverUptimeSeconds / 86400);
                //txtViewDays.setText(daysLeft);

                String hoursLeft = String.format("%d", (serverUptimeSeconds % 86400) / 3600);
                if (hoursLeft.equals("0")) {
                    tv_hour.setVisibility(View.GONE);
                }else {
                    tv_hour.setText(hoursLeft + " H");
                }

                String minutesLeft = String.format("%d", ((serverUptimeSeconds % 86400) % 3600) / 60);
                if (minutesLeft.equals("0")) {
                    tv_minutes.setVisibility(View.GONE);
                } else if (hoursLeft.equals("0")) {
                    tv_minutes.setText(minutesLeft + " Min");
                } else {
                    tv_minutes.setText(minutesLeft + " M");
                }

                String secondsLeft = String.format("%d", ((serverUptimeSeconds % 86400) % 3600) % 60);
                if (hoursLeft.equals("0") && minutesLeft.equals("0")) {
                    tv_seconds.setText(secondsLeft + " Seconds");
                } else {
                    tv_seconds.setText(secondsLeft);
                }
                if (hoursLeft.equals("0") && minutesLeft.equals("0") && secondsLeft.equals("0")){
                    Toast.makeText(DashBoardActivity.this, "Finished", Toast.LENGTH_SHORT).show();
                    GetCurDate();
                    mCountDownTimer.cancel();
                    layout_countdown.setVisibility(View.GONE);
                    btn_claim_daily_reward.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void onFinish() {

            }
        }.start();
    }

在你必须点击以领取奖励的按钮中,我只是将 loadDailyRewardCountDown 和 CountDown 布尔值调用为 false。

【问题讨论】:

    标签: android countdowntimer


    【解决方案1】:

    一种更简单且更易于维护的方法是节省用户在Shared Preferences 中首次启动应用程序的时间,然后每次用户再次启动应用程序时,都会检查自上次启动以来是否已过去 24 小时,并且如果是,则保存新时间。

    如果用户在 24 小时内碰巧使用了该应用程序,那么您可以使用您的CountDownTimer,并在他有权领取奖励后简单地停止计时器,因为用户不会连续 24 小时使用该应用程序。

    【讨论】: