方法一
Timer与TimerTask(Java实现)
publicclasstimerTaskextendsActivity{
privateintrecLen =11;
privateTextView txtView;
Timer timer = newTimer();
publicvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);
timer.schedule(task, 1000,1000);// timeTask
}
TimerTask task = newTimerTask() {
@Override
publicvoidrun() {
runOnUiThread(newRunnable() {// UI thread
@Override
publicvoidrun() {
recLen--;
txtView.setText(""+recLen);
if(recLen <0){
timer.cancel();
txtView.setVisibility(View.GONE);
}
}
});
}
};
}
方法二
TimerTask与Handler(不用Timer的改进型)
publicclasstimerTaskextendsActivity{
privateintrecLen =11;
privateTextView txtView;
Timer timer = newTimer();
publicvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);
timer.schedule(task, 1000,1000);// timeTask
}
finalHandler handler =newHandler(){
@Override
publicvoidhandleMessage(Message msg){
switch(msg.what) {
case1:
txtView.setText(""+recLen);
if(recLen <0){
timer.cancel();
txtView.setVisibility(View.GONE);
}
}
}
};
TimerTask task = newTimerTask() {
@Override
publicvoidrun() {
recLen--;
Message message = newMessage();
message.what = 1;
handler.sendMessage(message);
}
};
}
方法三
Handler与Message(不用TimerTask)
publicclasstimerTaskextendsActivity{
privateintrecLen =11;
privateTextView txtView;
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);
Message message = handler.obtainMessage(1);// Message
handler.sendMessageDelayed(message, 1000);
}
finalHandler handler =newHandler(){
publicvoidhandleMessage(Message msg){// handle message
switch(msg.what) {
case1:
recLen--;
txtView.setText(""+ recLen);
if(recLen >0){
Message message = handler.obtainMessage(1);
handler.sendMessageDelayed(message, 1000);// send message
}else{
txtView.setVisibility(View.GONE);
}
}
super.handleMessage(msg);
}
};
}
方法四
Handler与Thread(不占用UI线程)
publicclasstimerTaskextendsActivity{
privateintrecLen =0;
privateTextView txtView;
publicvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);
newThread(newMyThread()).start();// start thread
}
finalHandler handler =newHandler(){// handle
publicvoidhandleMessage(Message msg){
switch(msg.what) {
case1:
recLen++;
txtView.setText(""+ recLen);
}
super.handleMessage(msg);
}
};
publicclassMyThreadimplementsRunnable{// thread
@Override
publicvoidrun(){
while(true){
try{
Thread.sleep(1000);// sleep 1000ms
Message message = newMessage();
message.what = 1;
handler.sendMessage(message);
}catch(Exception e) {
}
}
}
}
}
方法五
Handler与Runnable(最简单型)
publicclasstimerTaskextendsActivity{
privateintrecLen =0;
privateTextView txtView;
publicvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);
handler.postDelayed(runnable, 1000);
}
Handler handler = newHandler();
Runnable runnable = 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,综合了前几种方法的优点,是最简的