?昨天开发了一个倒计时的功能,开始参考的是农民伯伯的算法,但是有误,且繁琐,因为我的项目中当前时间和截止时间都是从服务器上获取的,所以,以上方法并不太适合我,于是我写了一个更简单的方法,该方法的核心代码如下:
?
/* 主要的调用方法 */
TextView tableAlt;
int end;
int cur;
long mTimeDistance;
// 服务器上获取的当前时间
String currentTime = limited.getRec_datetime();
// 截止时间
String endTime = limits.get(0).getEndtime();
end = Integer.parseInt(endTime) * 1000;
cur = Integer.parseInt(currentTime) * 1000;
mTimeDistance = end - cur;
if (mTimeDistance <= 0) {
tableAlt.setText("活动结束");
} else {
handler.postDelayed(runnable, 1000);
}
?
/* handler的代码 */
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (mTimeDistance <= 0) {
tableAlt.setText("活动结束");
} else {
int deadDays = getDeadDays(mTimeDistance);
int deadHour = getDeadHour(mTimeDistance);
int deadMinute = getDeadMinute(mTimeDistance);
int deadMills = getDeadMills(mTimeDistance);
String hour = "";
String minute = "";
String mills = "";
if (deadHour < 10) {
hour = "0" + deadHour;
} else {
hour = "" + deadHour;
}
if (deadMinute < 10) {
minute = "0" + deadMinute;
} else {
minute = "" + deadMinute;
}
if (deadMills < 10) {
mills = "0" + deadMills;
} else {
mills = "" + deadMills;
}
String deadTimeStr = "( 倒计时 " + deadDays + "天" + hour + ":"
+ minute + ":" + mills + ")";
// add end by fly
tableAlt.setText(deadTimeStr);
mTimeDistance = mTimeDistance - 1000;
handler.postDelayed(this, 1000);
}
}
};
/* 计算时间的方法 */
private int getDeadDays(long timeDistance) {
return (int) (timeDistance / (24 * 60 * 60 * 1000));
}
private int getDeadHour(long timeDistance) {
int hour = (int) (timeDistance % (24 * 60 * 60 * 1000))
/ (60 * 60 * 1000);
return hour;
}
private int getDeadMinute(long timeDistance) {
int minute = 0;
minute = (int) (timeDistance % (24 * 60 * 60 * 1000)) % (60 * 60 * 1000)
/ (60 * 1000);
return minute;
}
private int getDeadMills(long timeDistance) {
int mills = (int) (timeDistance % (24 * 60 * 60 * 1000))
% (60 * 60 * 1000) % (60 * 1000) / 1000;
return mills;
}
最后的运行效果:( 倒计时 0天06:42:54 ),并在不停地倒计时中。
?