以下计时方式都是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种方式相关推荐

  1. 【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框获取组件实例常用的两种方式...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html ...

  2. 本地jar包推送到maven私有仓库常用的3种方式

    本地jar包推送到maven私有仓库常用的3种方式 1. 通过Nexus后台的upload功能上传,这个需要填写一堆信息,效率相当低下. 2. 通过maven的发布功能 3. 通过curl 1.登录m ...

  3. android ui 最新教程,Android更新UI的五种方式,androidui五种

    Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...

  4. android注册广播两种方式,Android 注册广播的两种方式对比

    Android 注册广播的两种方式对比 1.常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到, 他的注册方式就是在你的应用程序中的AndroidManif ...

  5. 投屏电脑怎么操作?投屏电脑最常用的4种方式

    想必很多人们都有手机视频投屏到电视上的一些操作.那么投屏电脑一般怎么操作呢?手机可以投屏,到电视之外也是可以投屏到电脑的,下面我们具体要介绍一下手机投屏到电脑最常用的4种方式.第1种是自带头皮功能的手 ...

  6. Java字符串反转常用的2种方式

    Java字符串反转常用的2种方式 1.利用StringBuilder封装的reverse()方法 2.利用数组进行反转 ①先将字符串转换为char类型的数组 ②对char类型数组进行反转 public ...

  7. android 图片方法,分享实现Android图片选择的两种方式

    Android选择图片的两种方式: 第一种:单张选取 通过隐式启动activity,跳转到相册选择一张返回结果 关键代码如下: 发送请求: private static final int PICTU ...

  8. android使用其他应用打开方式,Android 启动activity的4种方式及打开其他应用的activity的坑...

    Android启动的四种方式分别为standard,singleTop,singleTask,singleInstence. standard是最常见的activity启动方式,也是默认的启动的方式. ...

  9. android视频播放的方法,Android实现视频播放的几种方式

    Android实现视频播放的3种方式 Android提供了常见的视频编码,解码机制,使用Android自带的MediaPlayer,MediaController等类可以很方便的实现视频播放的功能.支 ...

最新文章

  1. python如何将图片的像素矩阵绘制成图片(python,matplotlib):TypeError: Invalid shape (1, 28, 28) for image data
  2. Moses 里的参数(未完成)
  3. mysql5.1 mysiam,将MySQL 5.1 MyISAM 转换成 INNODB 存储引擎
  4. 产品经理面试中那些不忍直视的奇葩题目,面试官你真是够了!
  5. 07-01-安装-Exchange Server 2019 on Win 2019 Core
  6. 关于SpringMvc实践的一些体会和总结
  7. ORACLE报错:enviroment variable ORACLE_SID not defined,please define int
  8. 失物招领小程序_在机场丢了东西怎么办?温州机场失物招领在线办理平台暖心上线!...
  9. Python多版本管理
  10. javascript中对象的深度克隆
  11. 《数字图像处理 第三版》(冈萨雷斯)——第十二章 目标识别
  12. Gaussview保存文件时,对话框一直弹不出来的原因
  13. 小程序服务器装rsshub,RssHub 部署
  14. 实现跨word文档的格式刷,两个word间格式刷
  15. 腾讯视频播放插件Txplayer的使用
  16. laravel.log could not be opened 解决方法
  17. 同一个图表创建双坐标轴,显示多个图例
  18. linux curse库函数,curse
  19. JAVA5 8 9章复习
  20. zabbix报警功能(邮件报警)---触发器/动作

热门文章

  1. xposed微信插件大全
  2. 新视野大学英语第三版读写教程(四)Unite 4 Midterm test answer
  3. 线程休眠 java_Java线程休眠和线程让步
  4. oracle数据库无法查询,【案例】Oracle报错ORA-01194 ORA-01110 由于数据库SCN不一致导致无法启动...
  5. 环德无人便利店面向全国代理加盟连锁便利店
  6. 最常用的分布式 ID 解决方案,都在这里了!
  7. RFID仓库管理解决方案-RFID智能仓储-RFID智能仓储-新导智能
  8. NOIP 2016 Day1 T3-换教室
  9. python执行CMD指令,并获取返回
  10. Sicily 1466. Taunt Exposure Estimation