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程序设计有所帮助。