Android实现计时与倒计时的常用方法小结
本文实例总结了Android实现计时与倒计时的常用方法。分享给大家供大家参考,具体如下:
方法一
Timer与TimerTask(Java实现)
publicclasstimerTaskextendsActivity{
privateintrecLen=11;
privateTextViewtxtView;
Timertimer=newTimer();
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView=(TextView)findViewById(R.id.txttime);
timer.schedule(task,1000,1000);//timeTask
}
TimerTasktask=newTimerTask(){
@Override
publicvoidrun(){
runOnUiThread(newRunnable(){//UIthread
@Override
publicvoidrun(){
recLen--;
txtView.setText(""+recLen);
if(recLen<0){
timer.cancel();
txtView.setVisibility(View.GONE);
}
}
});
}
};
}
方法二
TimerTask与Handler(不用Timer的改进型)
publicclasstimerTaskextendsActivity{
privateintrecLen=11;
privateTextViewtxtView;
Timertimer=newTimer();
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView=(TextView)findViewById(R.id.txttime);
timer.schedule(task,1000,1000);//timeTask
}
finalHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
case1:
txtView.setText(""+recLen);
if(recLen<0){
timer.cancel();
txtView.setVisibility(View.GONE);
}
}
}
};
TimerTasktask=newTimerTask(){
@Override
publicvoidrun(){
recLen--;
Messagemessage=newMessage();
message.what=1;
handler.sendMessage(message);
}
};
}
方法三
Handler与Message(不用TimerTask)
publicclasstimerTaskextendsActivity{
privateintrecLen=11;
privateTextViewtxtView;
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView=(TextView)findViewById(R.id.txttime);
Messagemessage=handler.obtainMessage(1);//Message
handler.sendMessageDelayed(message,1000);
}
finalHandlerhandler=newHandler(){
publicvoidhandleMessage(Messagemsg){//handlemessage
switch(msg.what){
case1:
recLen--;
txtView.setText(""+recLen);
if(recLen>0){
Messagemessage=handler.obtainMessage(1);
handler.sendMessageDelayed(message,1000);//sendmessage
}else{
txtView.setVisibility(View.GONE);
}
}
super.handleMessage(msg);
}
};
}
方法四
Handler与Thread(不占用UI线程)
publicclasstimerTaskextendsActivity{
privateintrecLen=0;
privateTextViewtxtView;
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView=(TextView)findViewById(R.id.txttime);
newThread(newMyThread()).start();//startthread
}
finalHandlerhandler=newHandler(){//handle
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
case1:
recLen++;
txtView.setText(""+recLen);
}
super.handleMessage(msg);
}
};
publicclassMyThreadimplementsRunnable{//thread
@Override
publicvoidrun(){
while(true){
try{
Thread.sleep(1000);//sleep1000ms
Messagemessage=newMessage();
message.what=1;
handler.sendMessage(message);
}catch(Exceptione){
}
}
}
}
}
方法五
Handler与Runnable(最简单型)
publicclasstimerTaskextendsActivity{
privateintrecLen=0;
privateTextViewtxtView;
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView=(TextView)findViewById(R.id.txttime);
handler.postDelayed(runnable,1000);
}
Handlerhandler=newHandler();
Runnablerunnable=newRunnable(){
@Override
publicvoidrun(){
recLen++;
txtView.setText(""+recLen);
handler.postDelayed(this,1000);
}
};
}
计时与倒计时
方法1,方法2和方法3,都是倒计时
方法4,方法5,都是计时
计时和倒计时,都可使用上述方法实现(代码稍加改动)
UI线程比较
方法1,方法2和方法3,都是在UI线程实现的计时;
方法4和方法5,是另开Runnable线程实现计时
实现方式比较
方法1,采用的是Java实现,即Timer和TimerTask方式;
其它四种方法,都采用了Handler消息处理
推荐使用
如果对UI线程交互要求不很高,可以选择方法2和方法3
如果考虑到UI线程阻塞,严重影响到用户体验,推荐使用方法4,另起线程单独用于计时和其它的逻辑处理
方法5,综合了前几种方法的优点,是最简的
希望本文所述对大家Android程序设计有所帮助。