Android实现计时与倒计时的几种方法

时间:2022-05-16 19:25:24

方法一

Timer与TimerTask(Java实现)

public class timerTask extends Activity{

private int recLen = 11;
private TextView txtView;
Timer timer = new Timer();

public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);

timer.schedule(task, 1000, 1000);// timeTask
}

TimerTask task = new TimerTask() {
@Override
public void run() {

runOnUiThread(new Runnable() {// UI thread
@Override
public void run() {
recLen--;
txtView.setText(""+recLen);
if(recLen < 0){
timer.cancel();
txtView.setVisibility(View.GONE);
}
}
});
}
};
}


方法二

TimerTask与Handler(不用Timer的改进型)

public class timerTask extends Activity{private int recLen = 11;private TextView txtView;Timer timer = new Timer();public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.timertask);txtView = (TextView)findViewById(R.id.txttime);timer.schedule(task, 1000, 1000);// timeTask}final Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg){switch (msg.what) {case 1:txtView.setText(""+recLen);if(recLen < 0){timer.cancel();txtView.setVisibility(View.GONE);}}}};TimerTask task = new TimerTask() {@Overridepublic void run() {recLen--;Message message = new Message();message.what = 1;handler.sendMessage(message);}};}

方法三

Handler与Message(不用TimerTask)

public class timerTask extends Activity{private int recLen = 11;private TextView txtView;public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.timertask); txtView = (TextView)findViewById(R.id.txttime);Message message = handler.obtainMessage(1);// Messagehandler.sendMessageDelayed(message, 1000);}  final Handler handler = new Handler(){public void handleMessage(Message msg){// handle messageswitch (msg.what) {case 1: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线程)

public class timerTask extends Activity{private int recLen = 0;private TextView txtView;public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.timertask);txtView = (TextView)findViewById(R.id.txttime);new Thread(new MyThread()).start();// start thread}final Handler handler = new Handler(){// handlepublic void handleMessage(Message msg){switch (msg.what) {case 1:recLen++;txtView.setText("" + recLen);}super.handleMessage(msg);}};public class MyThread implements Runnable{// thread@Overridepublic void run(){while(true){try{Thread.sleep(1000);// sleep 1000msMessage message = new Message();message.what = 1;handler.sendMessage(message);}catch (Exception e) {}}}}}

方法五

Handler与Runnable(最简单型)

public class timerTask extends Activity{private int recLen = 0;private TextView txtView;public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.timertask);txtView = (TextView)findViewById(R.id.txttime);handler.postDelayed(runnable, 1000);}Handler handler = new Handler();Runnable runnable = new Runnable() {@Overridepublic void run() {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之多线程工作-AsyncTask与handler