Android计时常用的7种方式
以下计时方式都是Android中常见的计时方式,现总结如下:
1.timer、timertask配合handler计时
2.countdowntimer计时
3.handler精确计时方式
4.handler普通循环方式
5.ScheduleExecuteService定时
6.AlarmManager定时
7.rxJava计时
实现效果图如下:
下面配合具体代码详细介绍上述计时方式:
1.timer、timertask配合handler计时
实现方式:使用timer.schedule实现任务延迟,定时执行,timerTask实现的是Runnable,从timerTask中抛出的任务交给Handler执行即可:
// timer timerTaskprivate int minute = 1;//这是分钟private int second = 1;//这是分钟后面的秒数。这里是以30分钟为例的,所以,minute是30,second是0private TextView timeView1;private Button btn_stop1;private Button btn_start1;private Timer timer;private TimerTask timerTask;private void startMethod1() {//防止多次点击开启计时器if (timer != null) {timer.cancel();timer = null;}if (timerTask != null) {timerTask = null;}timerTask = new TimerTask() {@Overridepublic void run() {Message msg = new Message();msg.what = 0;handler.sendMessage(msg);}};timer = new Timer();timer.schedule(timerTask, 0, 1000);}
从timer中抛出的消息,在handler中执行,这个handler就是对时间的格式化,输出01:29的格式:
//这是接收回来处理的消息private Handler handler = new Handler() {public void handleMessage(Message msg) {if (minute == 0) {if (second == 0) {timeView1.setText("Time out !");if (timer != null) {timer.cancel();timer = null;}if (timerTask != null) {timerTask = null;}} else {second--;if (second >= 10) {timeView1.setText("0" + minute + ":" + second);} else {timeView1.setText("0" + minute + ":0" + second);}}} else {if (second == 0) {second = 59;minute--;if (minute >= 10) {timeView1.setText(minute + ":" + second);} else {timeView1.setText("0" + minute + ":" + second);}} else {second--;if (second >= 10) {if (minute >= 10) {timeView1.setText(minute + ":" + second);} else {timeView1.setText("0" + minute + ":" + second);}} else {if (minute >= 10) {timeView1.setText(minute + ":0" + second);} else {timeView1.setText("0" + minute + ":0" + second);}}}}}};
当然,上述方法可以使用String.format()简化成一行,完成时间的格式化输出:
private String formatTime2(long seconds) {return String.format(" %02d:%02d", seconds / 60, seconds % 60);}
2.countdowntimer计时
由于countDownTimer本身是由handler实现的,其计时是有误差的,简单用法如下,如何屏蔽掉计时误差,请参考handler实现精确计时的两种方式 https://blog.csdn.net/cpcpcp123/article/details/88542113:
private void startMethod2() {countDownTimer.start();}/*** 第一个参数表示总时间,第二个参数表示间隔时间。意思就是每隔一秒会回调一次方法onTick,然后10秒之后会回调onFinish方法*/private CountDownTimer countDownTimer = new CountDownTimer(1000 * 100, 1000) {@Overridepublic void onTick(long millisUntilFinished) {//秒转化成 00:00形式一
// timeView2.setText(formatTime1(millisUntilFinished) + "");//秒转化成 00:00形式二timeView2.setText(formatTime2(millisUntilFinished / 1000));Log.e("hehehe ", millisUntilFinished + " ");}@Overridepublic void onFinish() {}};
3.handler精确计时方式
private void startMethod3() {mCalHandler.post(mTicker);}/*** 精确修正时间*/private Handler mCalHandler = new Handler(Looper.getMainLooper());private final Runnable mTicker = new Runnable() {public void run() {long now = SystemClock.uptimeMillis();long next = now + (1000 - now % 1000);mCalHandler.postAtTime(mTicker, next);timeView3.setText(next + "");}};
4.handler普通循环方式
相关内容可参看:https://blog.csdn.net/ithomer/article/details/6903084
/*** 通过Handler延迟发送消息的形式实现定时任务。*/public static final int CHANGE_TIPS_TIMER_INTERVAL = 1000;private Handler mChangeTipsHandler = new Handler(Looper.getMainLooper());int i = 1;private void startMethod4() {Runnable mChangeTipsRunnable = new Runnable() {@Overridepublic void run() {timeView4.setText(i++ + "handler");mChangeTipsHandler.postDelayed(this, CHANGE_TIPS_TIMER_INTERVAL);}};mChangeTipsHandler.post(mChangeTipsRunnable);}
5.ScheduleExecuteService定时
/*** ScheduledExecutorService* ScheduledExecutorService是从JDK1.5做为并发工具类被引进的,存在于java.util.concurrent,这是最理想的定时任务实现方式。* 相比于上面两个方法,它有以下好处:* 相比于Timer的单线程,它是通过线程池的方式来执行任务的,所以可以支持多个任务并发执行 ,而且弥补了上面所说的Timer的缺陷* 可以很灵活的去设定第一次执行任务delay时间* 提供了良好的约定,以便设定执行的时间间隔*/
private ScheduledExecutorService scheduledExecutor5 = Executors.newSingleThreadScheduledExecutor();private void startMethod5() {Runnable runnable5 = new Runnable() {@Overridepublic void run() {timeView5.setText("每隔 " + taskcount5++ + " 秒执行");}};scheduledExecutor5.scheduleAtFixedRate(runnable5, 0, 1000, TimeUnit.MILLISECONDS);}
6.AlarmManager定时
private void startMethod6() {delayStartTask();}private void delayStartTask() {Intent intent = new Intent();intent.setAction(DELAY_TASK_ACTION);PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);AlarmManager am = (AlarmManager) getApplication().getSystemService(Context.ALARM_SERVICE);am.set(AlarmManager.RTC, System.currentTimeMillis(), pi);}
7.rxJava计时
Android计时常用的7种方式相关推荐
- 【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框获取组件实例常用的两种方式...
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html ...
- 本地jar包推送到maven私有仓库常用的3种方式
本地jar包推送到maven私有仓库常用的3种方式 1. 通过Nexus后台的upload功能上传,这个需要填写一堆信息,效率相当低下. 2. 通过maven的发布功能 3. 通过curl 1.登录m ...
- android ui 最新教程,Android更新UI的五种方式,androidui五种
Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...
- android注册广播两种方式,Android 注册广播的两种方式对比
Android 注册广播的两种方式对比 1.常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到, 他的注册方式就是在你的应用程序中的AndroidManif ...
- 投屏电脑怎么操作?投屏电脑最常用的4种方式
想必很多人们都有手机视频投屏到电视上的一些操作.那么投屏电脑一般怎么操作呢?手机可以投屏,到电视之外也是可以投屏到电脑的,下面我们具体要介绍一下手机投屏到电脑最常用的4种方式.第1种是自带头皮功能的手 ...
- Java字符串反转常用的2种方式
Java字符串反转常用的2种方式 1.利用StringBuilder封装的reverse()方法 2.利用数组进行反转 ①先将字符串转换为char类型的数组 ②对char类型数组进行反转 public ...
- android 图片方法,分享实现Android图片选择的两种方式
Android选择图片的两种方式: 第一种:单张选取 通过隐式启动activity,跳转到相册选择一张返回结果 关键代码如下: 发送请求: private static final int PICTU ...
- android使用其他应用打开方式,Android 启动activity的4种方式及打开其他应用的activity的坑...
Android启动的四种方式分别为standard,singleTop,singleTask,singleInstence. standard是最常见的activity启动方式,也是默认的启动的方式. ...
- android视频播放的方法,Android实现视频播放的几种方式
Android实现视频播放的3种方式 Android提供了常见的视频编码,解码机制,使用Android自带的MediaPlayer,MediaController等类可以很方便的实现视频播放的功能.支 ...
最新文章
- python如何将图片的像素矩阵绘制成图片(python,matplotlib):TypeError: Invalid shape (1, 28, 28) for image data
- Moses 里的参数(未完成)
- mysql5.1 mysiam,将MySQL 5.1 MyISAM 转换成 INNODB 存储引擎
- 产品经理面试中那些不忍直视的奇葩题目,面试官你真是够了!
- 07-01-安装-Exchange Server 2019 on Win 2019 Core
- 关于SpringMvc实践的一些体会和总结
- ORACLE报错:enviroment variable ORACLE_SID not defined,please define int
- 失物招领小程序_在机场丢了东西怎么办?温州机场失物招领在线办理平台暖心上线!...
- Python多版本管理
- javascript中对象的深度克隆
- 《数字图像处理 第三版》(冈萨雷斯)——第十二章 目标识别
- Gaussview保存文件时,对话框一直弹不出来的原因
- 小程序服务器装rsshub,RssHub 部署
- 实现跨word文档的格式刷,两个word间格式刷
- 腾讯视频播放插件Txplayer的使用
- laravel.log could not be opened 解决方法
- 同一个图表创建双坐标轴,显示多个图例
- linux curse库函数,curse
- JAVA5 8 9章复习
- zabbix报警功能(邮件报警)---触发器/动作
热门文章
- xposed微信插件大全
- 新视野大学英语第三版读写教程(四)Unite 4 Midterm test answer
- 线程休眠 java_Java线程休眠和线程让步
- oracle数据库无法查询,【案例】Oracle报错ORA-01194 ORA-01110 由于数据库SCN不一致导致无法启动...
- 环德无人便利店面向全国代理加盟连锁便利店
- 最常用的分布式 ID 解决方案,都在这里了!
- RFID仓库管理解决方案-RFID智能仓储-RFID智能仓储-新导智能
- NOIP 2016 Day1 T3-换教室
- python执行CMD指令,并获取返回
- Sicily 1466. Taunt Exposure Estimation