我在我的应用程序中使用倒数计时器,我需要显示即将到来的日期,以天数小时,分钟和秒为单位。我得到了天,小时,分钟和秒,但是当我将其设置为文本视图时,倒计时无法启动。以下是我的代码。
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;
}
这是输出
为什么倒计时没有开始?任何建议都表示赞赏。
答案 0 :(得分:6)
您没有使用millisUntilFinished
参数更新timeCalculate()
中的时间。从:
@Override
public void onTick(long millisUntilFinished) {
tv3.setText(millisUntilFinished + " Countdown");
}
一旦确认计时器正在运行,您将需要一种方法将millisUntilFinished
转换为人类可读的字符串。
与Java中的日期和时间相关的类不必要地使用并且具有一些模糊的错误。 (例如,大多数Date类都已弃用,但推荐的Calendar类仍然严重依赖于Date ...)第三方库Joda Time是一个受欢迎的替代品。
添加
输出不是我预期的
未来25,000至700天不是我所期望的,date
似乎是错误的。正如加布里埃尔在another answer中指出的那样,这个年份的价值是从1900年算起的。虽然其他的东西仍然是错的,因为将来25,000天不到70年......
但是,此构造函数已弃用且不应使用,Calendar是推荐的类。我为你写了quick demo使用日历。
但要明白CountDownTimer本身有几个基本缺陷:
onTick()
CDT都会在整个时间内增加几毫秒,我注意到它每天可以轻松添加7分半钟。 onTick()
。从5开始倒数时,我通常会看到"5, 4, 3, 2, <long pause>"
,然后onFinished()
会显示"0"
... 我在上一个问题中重写了CDT:android CountDownTimer - additional milliseconds delay between ticks。
答案 1 :(得分: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);
答案 2 :(得分: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
之后尝试工作。 并根据需要获得日期和时间。
答案 3 :(得分: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();