注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

早衰男的巢

大音希声 道隐无名

 
 
 

日志

 
 

Android: 倒计时实现  

2014-12-01 12:24:39|  分类: android笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
要在界面上显示一个倒计时的时钟。在有没有查任何资料的情况下写了下面一段(不想浪费时间的同学跳过,从第二段加粗的字体开始看)。

new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
long ts = F.getGameDeadlineTimeStamp(getActivity()); //这个时间戳单位是s PHP
timeleft = ts - ((new Date()).getTime()/1000); //ms => s

while(tsLooper){
mHandler.post(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
int tlhour = (int) Math.floor(timeleft/3600);
int tlmin = (int) (Math.floor(timeleft/60)%60);
int tlsec = (int) (timeleft%60);
String strtl = String.format("%1$02d:%2$02d:%3$02d",tlhour,tlmin,tlsec );
tvdate.setText(strtl); //输出

if(timeleft<=0) tsLooper = false; //倒计时完毕跳出倒数。
}
});
timeleft --;
SystemClock.sleep(1000);//通过这种方式来间隔运行
}
}

}).start();


以上忽略了一些上下文的代码。倒计时主要由一个线程通过SystemClock.sleep() 循环自减 timeleft 变量实现倒数。

运行倒是能运行,唯一有点小瑕疵么..就是这个倒计时的方式,由于要用Handler 来排队执行,所以执行的时间点有点不准,像band队里的鼓手总是鼓点总是踩不准bit很是恼人,可能出现 59,58,57 —— —— 55,54...这样漏掉一个的状况,反正是各种不爽。

回炉查查其他人是怎么实现的,才发现有个原生现成的 CountDownTimer 类

用法也是超简单的,四个方法 start、cancel、onTick、onFinish。两个参数 倒计时长(long ms)、步进间隔(long ms)。
把原来的代码改改,更简洁了。踩点也精准。

long timeleft = ((long) F.getGameDeadlineTimeStamp(getActivity()))*1000 - (new Date()).getTime(); //这次反过来,单位是ms的
Log.d(F.CFG_NAME,"startDeadlineLooper! "+timeleft);
cdt = new CountDownTimer(timeleft,1000){
@Override
public void onFinish() {}

@Override
public void onTick(long millisUntilFinished) {
// TODO Auto-generated method stub
Log.d(F.CFG_NAME,"Tik Tok");
long timeleft = millisUntilFinished/1000;
int tlhour = (int) Math.floor(timeleft/3600);
int tlmin = (int) (Math.floor(timeleft/60)%60);
int tlsec = (int) (timeleft%60);
String strtl = String.format("%1$02d:%2$02d:%3$02d",tlhour,tlmin,tlsec );
tvdate.setText(strtl);
}
};

cdt.start();


……


@Override
public void onPause(){
//暂停倒数,我这是用在Fragment里,离开当前的Fragment还是会在后台运行,所以要在onPause的时候把cdt倒数注销掉
if(cdt!=null){
cdt.cancel();
cdt = null;
}
super.onPause();
}

嘿嘿。居然是个API1.0开始支持的类...
  评论这张
 
阅读(535)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018