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,计时
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
MyBatis入门实例教程之创建一个简单的程序
2022-04-26 14:38:14
![](https://img.aspxhome.com/file/2023/0/129280_0s.png)
android学习笔记之View的滑动
2022-12-30 07:51:36
![](https://img.aspxhome.com/file/2023/4/130304_0s.gif)
各种格式的编码解码工具类分享(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
![](https://img.aspxhome.com/file/2023/4/137654_0s.jpg)
Java 实战项目锤炼之网上花店商城的实现流程
2021-09-14 04:51:45
![](https://img.aspxhome.com/file/2023/4/108404_0s.png)
心动吗?正大光明的免费使用IntelliJ IDEA商业版
2023-11-25 04:29:48
![](https://img.aspxhome.com/file/2023/6/59976_0s.jpg)
Spring中Bean的生命周期使用解析
2021-09-06 23:06:54
![](https://img.aspxhome.com/file/2023/4/78924_0s.jpg)
OpenCV实现简单摄像头视频监控程序
2021-12-10 01:23:07
logback中显示mybatis查询日志文件并写入的方法示例
2023-11-03 03:01:48
Java实现两人五子棋游戏(五) 判断是否有一方胜出
2022-03-03 18:29:44
![](https://img.aspxhome.com/file/2023/5/64955_0s.jpg)
Android使用OkHttp发送post请求
2022-12-04 13:24:57
android使用viewpager计算偏移量实现选项卡功能
2023-12-06 12:53:02
![](https://img.aspxhome.com/file/2023/9/123339_0s.png)
RocketMQ生产者调用start发送消息原理示例
2022-07-05 20:13:04
![](https://img.aspxhome.com/file/2023/2/63692_0s.png)
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
![](https://img.aspxhome.com/file/2023/5/113245_0s.png)
避免sql注入_动力节点Java学院整理
2023-08-21 17:39:12