Android实现计时与倒计时的常用方法小结

作者:阳光岛主 时间:2023-10-28 07:18:02 

本文实例总结了Android实现计时与倒计时的常用方法。分享给大家供大家参考,具体如下:

方法一

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(){
   @Override
   public 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() {
   @Override
   public 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);   // Message
   handler.sendMessageDelayed(message, 1000);
 }  
 final Handler handler = new Handler(){
   public void handleMessage(Message msg){     // handle message
     switch (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(){     // handle
   public void handleMessage(Message msg){
     switch (msg.what) {
     case 1:
       recLen++;
       txtView.setText("" + recLen);
     }
     super.handleMessage(msg);
   }
 };
 public class MyThread implements Runnable{   // thread
   @Override
   public void run(){
     while(true){
       try{
         Thread.sleep(1000);   // sleep 1000ms
         Message 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() {
   @Override
   public 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程序设计有所帮助。

标签:Android,计时
0
投稿

猜你喜欢

  • MyBatis入门实例教程之创建一个简单的程序

    2022-04-26 14:38:14
  • android学习笔记之View的滑动

    2022-12-30 07:51:36
  • 各种格式的编码解码工具类分享(hex解码 base64编码)

    2021-11-17 07:04:51
  • C#串口连接的读取和发送详解

    2022-05-11 10:04:47
  • Android手机获取IP地址的两种方法

    2021-05-28 14:18:51
  • Mapper批量插入Oracle数据@InsertProvider注解

    2023-02-11 15:13:40
  • Android实现Camera2预览和拍照效果

    2021-09-30 20:03:42
  • Java 实战项目锤炼之网上花店商城的实现流程

    2021-09-14 04:51:45
  • 心动吗?正大光明的免费使用IntelliJ IDEA商业版

    2023-11-25 04:29:48
  • Spring中Bean的生命周期使用解析

    2021-09-06 23:06:54
  • OpenCV实现简单摄像头视频监控程序

    2021-12-10 01:23:07
  • logback中显示mybatis查询日志文件并写入的方法示例

    2023-11-03 03:01:48
  • Java实现两人五子棋游戏(五) 判断是否有一方胜出

    2022-03-03 18:29:44
  • Android使用OkHttp发送post请求

    2022-12-04 13:24:57
  • android使用viewpager计算偏移量实现选项卡功能

    2023-12-06 12:53:02
  • RocketMQ生产者调用start发送消息原理示例

    2022-07-05 20:13:04
  • Android Vitamio和ExoPlayer两种播放器优劣分析

    2023-02-25 13:21:51
  • C#异步编程由浅入深(二)之Async/Await的使用

    2022-10-14 16:45:20
  • Jmeter对接口测试入参实现MD5加密

    2023-08-19 08:59:05
  • 避免sql注入_动力节点Java学院整理

    2023-08-21 17:39:12
  • asp之家 软件编程 m.aspxhome.com