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

所属分类: 软件编程 / Android 阅读数: 1181
收藏 0 赞 0 分享

本文实例总结了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网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多