3

我在我的应用程序中使用倒数计时器,我需要以天数小时分钟和秒数显示即将到来的日期。我得到了天、小时、分钟和秒,但是当我将其设置为文本视图时,倒计时不会开始。下面是我的代码。

Date date = new Date(2013,Integer.parseInt(datess.get(k).split("-")[1])-1,Integer.parseInt(datess.get(k).split("-")[0]),hours,mins,secs);  
     long dtMili = System.currentTimeMillis();  
     Date dateNow = new Date(dtMili);  
      remain = date.getTime() - dateNow.getTime();


MyCount counter = new MyCount(remain,1000);
            counter.start();

public class MyCount extends CountDownTimer{
    public MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
        }



    @Override
    public void onFinish() {
        // TODO Auto-generated method stub

        tv3.setText("done");
    }

    @Override
    public void onTick(long millisUntilFinished) {
        // TODO Auto-generated method stub


        tv3.setText(timeCalculate(millisUntilFinished/1000) + " Countdown");

    }
}

 public String timeCalculate(long ttime)   
   {  
     long  daysuuu,hoursuuu, minutesuuu, secondsuuu;  
     String daysT = "", restT = "";  



     daysuuu = (Math.round(ttime) / 86400);  
     hoursuuu = (Math.round(ttime) / 3600) - (daysuuu * 24);  
     minutesuuu = (Math.round(ttime) / 60) - (daysuuu * 1440) - (hoursuuu * 60);  
     secondsuuu = Math.round(ttime) % 60;  


     if(daysuuu==1) daysT = String.format("%d day ", daysuuu);  
     if(daysuuu>1) daysT = String.format("%d days ", daysuuu);  

     restT = String.format("%02d:%02d:%02d", hoursuuu, minutesuuu, secondsuuu);  

     return daysT + restT;  
   }  

这是输出

在此处输入图像描述

为什么倒计时没有开始?任何建议表示赞赏。

4

4 回答 4

6

您没有使用该millisUntilFinished参数来更新您的时间timeCalculate()。从...开始:

@Override
public void onTick(long millisUntilFinished) {
    tv3.setText(millisUntilFinished + " Countdown");
}

一旦您确认计时器正在工作,您将需要一种方法来转换millisUntilFinished为人类可读的字符串。

Java 中与日期和时间相关的类不必要地难以使用,并且有一些难以理解的错误。(例如,大部分 Date 类已被弃用,但推荐的 Calendar 类仍然严重依赖 Date...) 3rd 方库Joda Time是一个流行的替代品。


添加

输出不是我所期望的

未来 25,000 到 700 天也不是我所期望的,date似乎是错误的。正如加布里埃尔在这个问题的另一个答案中指出的那样,年份值是从 1900 年开始计算的。虽然还有其他问题,因为 25,000 天是未来不到 70 年......
但是这个构造函数已被弃用,不应使用,日历是推荐的课程。我为你写了一个使用日历 的快速演示。

但是要明白 CountDownTimer 本身有几个基本缺陷:

  • 每次onTick()调用 CDT 都会给总时间增加几毫秒,我注意到它每天可以轻松增加 7 分半钟。
  • 由于第一个错误,最后一个错误onTick()可能不会被调用。从 5 开始倒数时,我通常会看到"5, 4, 3, 2, <long pause>"然后onFinished()显示"0"...

我在上一个问题中重写了 CDT:android CountDownTimer - additional milliseconds delay between ticks

于 2012-12-12T06:39:44.233 回答
2

您的问题是您没有正确使用 Date() 。

java.util.Date.Date(int year, int month, int day, int hour, int minute, int second)的参数,在第一个参数中使用0表示1900年。

您编写的代码计算未来近 2000 年的日期,然后减去当前时间,这使得倒计时很长 ;-)。

如果您将一行更改为,该应用程序应该可以工作

Date date = new Date(2013-1900,Integer.parseInt(datess.get(k).split("-")[1])-1,Integer.parseInt(datess.get(k).split("-")[0]),hours,mins,secs);  
于 2012-12-15T15:32:39.970 回答
1

亲爱的使用Chronometer

int seconds;

    chronometer.setOnChronometerTickListener(new OnChronometerTickListener() 
                    {   
                        public void onChronometerTick(Chronometer chronometer) 
                        {
                            seconds = (int) ((SystemClock.elapsedRealtime() - chronometer.getBase()) / 1000);
                            String strTime = (seconds / 60) + ":" + (seconds % 60);
                            lblTime.setText(strTime);
                        }
                    });
                    chronometer.setBase(SystemClock.elapsedRealtime());
                    chronometer.start

之后尝试工作。并根据需要获取日期和时间。

于 2012-12-18T13:46:33.583 回答
0

试试这个代码

CountDownTimer countDown = new CountDownTimer(3000,1000) {

        @Override
        public void onTick(long millisUntilFinished) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onFinish() {
            // TODO Auto-generated method stub

        }
    };
    countDown.start();
于 2012-12-12T06:26:16.640 回答