[转载]倒计时的实现方案-类似限时抢购商品等-Android开发源码下载-eoe Android开发者社区_Android开发论坛

[转载]倒计时的实现方案-类似限时抢购商品等-Android开发源码下载-eoe Android开发者社区_Android开发论坛.

网上有很多关于倒计时的实现方案.也不知道我的这个方案大家有没有提到,我在此帖出来,希望能够给大家提供一个参考.

应用平台: Android;
应用案例: 大量商品的限时抢购等.

请看下图:

类似于这样的倒计时,不知道大家有没有遇到过,大家又能想到哪些方案?????
1、每一秒到服务器上面去取一次数据?
2、每一秒,通过一个Handler去循环遍历,对每一条去刷新一次时间控件?
3、还是大家有其它的想法。

上述两种方案都不可取:
1、网络连接有时间差,况且数据访问量大的情况,服务器没法承受。
2、 循环遍历可行,但是要在数据量少的情况下,如果数据量过大,那么会卡屏,对系统内存的占用也较高。

我给大家的方案是对Android 系统中 DigitalClock 进行一次封装。
通过继承以下方法并改变内部的实现。
@Override
protected void onAttachedToWindow() {
mTickerStopped = false;
super.onAttachedToWindow();
mHandler = new Handler();

  /**
* requests a tick on the next hard-second boundary
*/
mTicker = new Runnable() {
public void run() {
if (mTickerStopped)
return;
long currentTime = System.currentTimeMillis();
if (currentTime / 1000 == endTime / 1000 – 5 * 60) {      // currentTime 是超过现在的当前时间。能过这个运算,达到倒计时的效果
mClockListener.remainFiveMinutes();
}
long distanceTime = endTime – currentTime;
distanceTime /= 1000;
if (distanceTime == 0) {
setText(“00:00:00”);
onDetachedFromWindow();
mClockListener.timeEnd();
} else if (distanceTime < 0) {
setText(“00:00:00”);
} else {
setText(dealTime(distanceTime));
}
invalidate();
long now = SystemClock.uptimeMillis();
long next = now + (1000 – now % 1000);
mHandler.postAtTime(mTicker, next);
}
};
mTicker.run();
}
大家可以看看Android 系统中 DigitalClock 的这个方法的实现:
@Override
protected void onAttachedToWindow() {
mTickerStopped = false;
super.onAttachedToWindow();
mHandler = new Handler();

/**
* requests a tick on the next hard-second boundary
*/
mTicker = new Runnable() {
public void run() {
if (mTickerStopped) return;
mCalendar.setTimeInMillis(System.currentTimeMillis());
setText(DateFormat.format(mFormat, mCalendar));
invalidate();
long now = SystemClock.uptimeMillis();
long next = now + (1000 – now % 1000);
mHandler.postAtTime(mTicker, next);
}
};
mTicker.run();
}
跟上述是截然不同的。

不多说,有兴趣的下去研究研究。谢谢。
源代码如下:
TimeSale.rar (144.61 KB, 下载次数: 351)

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏