1. Handler 与Message方法实现倒计时功能

关于Handler与Message消息机制的原理可查看:Android--Handler使用应运及消息机制处理原理分析

这个设计思路也是最经常使用的一种设计

比如: 当点击一个button触发事件,在事件中调用 handler的sendMessage的方法。那么在相应的handler的handleMessage中就会接收到这个消息。在这里里面再进行一些逻辑推断,再通过调用handler的 sendMessageDelayed这个延时发送消息的方法进行消息发送,同一时候更新相关的设置信息

  1. </pre><pre>
  1. /**
  2. * 使用handler 与 message方法实现倒计时功能
  3. */
  4.  
  5. /**
  6. * 倒计时总长
  7. */
  8. long totalCount = 6000;
  9. /**
  10. * 倒计时时间间隔
  11. */
  12. long flag = 1000;
  13.  
  14. private void startCountDown4() {
  15. Message msg = Message.obtain();
  16. msg.what = 001;
  17. mhHandler.sendMessage(msg);
  18. }
  19.  
  20. private Handler mhHandler = new Handler() {
  21. public void handleMessage(android.os.Message msg) {
  22. if (msg.what == 001) {
  23. if (totalCount > 0) {
  24. /**
  25. * 发送延迟1秒的消息
  26. */
  27. Message msg1 = Message.obtain();
  28. msg1.what = 001;
  29. mhHandler.sendMessageDelayed(msg1, flag);
  30. /**
  31. * 更新显示UI
  32. */
  33. textview.setText(totalCount / 1000 + "秒");
  34. /**
  35. * 更新倒计时总时间
  36. */
  37. totalCount -= flag;
  38. }
  39.  
  40. }
  41.  
  42. };
  43. };

2 使用Handler的post与Runnable结合实现倒计时功能

运行handler.post();方法,方法中传入一个runnable实例对象。会运行 这个实例对象的run方法。在run方法中再进行想着逻辑的推断。然后调用handler.postDelayed方法实例延迟运行相关操作的方法,这里是运行了相同的操作。从而达到实现一个倒计时的功能

  1. </pre><pre>
  1. /**
  2. * 使用handler的post方法与 runnable结合 实现倒计时的功能
  3. */
  4. /**
  5. * 倒计时总长
  6. */
  7. long totalCount = 6000;
  8. /**
  9. * 倒计时时间间隔
  10. */
  11. long flag = 1000;
  12. public Handler handler = new Handler();
  13. public Runnable countDownRunn = new Runnable() {
  14.  
  15. @Override
  16. public void run() {
  17. if (totalCount > 0) {
  18. handler.postDelayed(countDownRunn, flag);
  19. totalCount -= flag;
  20. textview.setText(totalCount / 1000 + "秒");
  21. }
  22.  
  23. }
  24. };
  25.  
  26. public void startCountDown3() {
  27. handler.post(countDownRunn);
  28. }

3  使用子线程来实现倒计时

这里通过开启一个子线程,在线程中开启一个while循环,在这个循环中通过调用方法 seytemClock.sleep(time) 使用这个线程堵塞time时间,然后再进行相关的设置,从而达到倒计时的效果

  1. /**
  2. * 倒计时总长
  3. */
  4. long totalCount = 6000;
  5. /**
  6. * 倒计时时间间隔
  7. */
  8. long flag = 1000;
  9.  
  10. /**
  11. * 使用子线程实现倒计时的功能
  12. */
  13. public void startCountDown2() {
  14. new Thread() {
  15. public void run() {
  16. while (totalCount > 0) {
  17. /**
  18. * 设置每隔flag时间间隔运行一次
  19. */
  20. SystemClock.sleep(flag);
  21. /**
  22. * 更新页面显示时间
  23. */
  24. MainActivity.this.runOnUiThread(new Runnable() {
  25.  
  26. @Override
  27. public void run() {
  28. textview.setText(totalCount / 1000 + "秒");
  29. }
  30. });
  31.  
  32. totalCount -= flag;
  33. }
  34. };
  35. }.start();
  36. }

4 使用CountDownTimer类来实现倒计时功能

相对来说使用这个类的设计逻辑比較简单

  1. /**
  2. * 使用CountDownTimer 类实现倒计时功能
  3. */
  4.  
  5. public void startCountDown() {
  6. TimeCount timeCount = new TimeCount(60000, 1000);
  7. timeCount.start();
  8.  
  9. }
  10.  
  11. public class TimeCount extends CountDownTimer {
  12.  
  13. /**
  14. *
  15. * @param millisInFuture
  16. * 总倒计时时长 单位毫秒
  17. * @param countDownInterval
  18. * 倒计时时间间隔 单位毫秒
  19. */
  20. public TimeCount(long millisInFuture, long countDownInterval) {
  21. super(millisInFuture, countDownInterval);
  22. }
  23.  
  24. @Override
  25. public void onTick(long l) {
  26.  
  27. textview.setText(l / 1000 + "秒");
  28. }
  29.  
  30. @Override
  31. public void onFinish() {
  32.  
  33. }
  34. }

5 使用属性动画的方式来实现倒计时

  1. /**
  2. * 使用属性动画的方式来实现
  3. *
  4. */
  5. int totalNumber = 6000;
  6. private void startCountDown5(){
  7. final ValueAnimator animator = ValueAnimator.ofInt(0,totalNumber/1000);
  8. animator.setDuration(totalNumber);
  9. animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  10. @Override
  11. public void onAnimationUpdate(ValueAnimator animation) {
  12. Integer value = (Integer) animation.getAnimatedValue();
  13. /**
  14. * value 这里获取到的是递增获取到的时间 单位为秒
  15. *
  16. */
  17. textview.setText((totalCount-value*1000)/1000+"秒");
  18. if (value*1000>(totalCount-1000)) {
  19. animator.cancel();
  20. }
  21. }
  22. });
  23. animator.start();
  24.  
  25. }

这样的方式实现的效果可能会不佳,只是也不失为一种思路,在使用的时候能够调整ValueAnimator.ofInt()中第二个參数的计算參数

6 .使用 Timer 与TimerTask方式实现

  1. Timer mSignTimer = new Timer();
  2. mSignTimer.schedule(new TimerTask() {
  3. @Override
  4. public void run() {
  5. mCurrentTime += 1000;
  6. getActivity().runOnUiThread(
  7. new Runnable() {
  8. public void run() {
  9. mSignDateTextView.setText(DataUtils
  10. .getDateYear(mCurrentTime) + "");
  11.  
  12. }
  13. });
  14.  
  15. }
  16. }, 0, 1000);

这里用schedule方法。第一个參数是TimerTask对象,第二个參数表示開始运行前的延时时间(单位是milliseconds。这里定义了0),第三个參数是表示定时运行时间(单位是milliseconds,这里定义了1000)

这里使用的mCurrentTime是系统当前的时间 ,设置schedule的第三个參数为1000,也就是每1秒运行一下这种方法,那么每次运行加1000毫秒。从而实现了计时功能,当然这里使用的不是倒计时的功能。加一些逻辑推断是能够实现倒计时功能的

这里是直接调用Context对象的runOnUiThread方法。在主线程中进行更新Ui上的显示效果

源代码:

Android倒计时案例展示的更多相关文章

  1. android倒计时(整理)

    android倒计时 用到CountDownTimer Android中文API(143) —— CountDownTimer 前言 本章内容android.os.CountDownTime章节,版本 ...

  2. Winform外包团队 项目案例展示

    北京动点飞扬软件开发团队 C# WInform项目案例展示 长年承接WInForm C#项目开发,商业案例欢迎联系我们索取 有相关项目外包定制开发 欢迎联系我们 qq372900288 Tel 139 ...

  3. WinForm外包公司 WInform外包项目监控案例展示

    北京动点飞扬软件开发团队 C# WInform监控项目案例展示 长年承接WInForm C#项目开发,商业案例欢迎联系我们索取 有相关项目外包定制开发 欢迎联系我们 qq372900288 Tel 1 ...

  4. android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】

    android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...

  5. Flex外包公司——Flex案例展示

    Flex案例展示 做的mail系统:  http://gowebtop.com/webtop/ 在线购书网站  http://book.orzar.net/ eBay购物网站  http://www. ...

  6. Scala进阶之路-Scala中的枚举用法案例展示

    Scala进阶之路-Scala中的枚举用法案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的枚举值和Java中的枚举值有点差别,不过使用起来也都差大同小异,我这 ...

  7. AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...

  8. 流媒体协议(RTMP、RTSP、UDP、HTTP、MMS)转换小工具(RTSP转成RTMP案例展示)(转)

    源: 流媒体协议(RTMP.RTSP.UDP.HTTP.MMS)转换小工具(RTSP转成RTMP案例展示)

  9. java基础-多线程应用案例展示

    java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...

随机推荐

  1. Django+Nginx+uwsgi搭建自己的博客(五)

    在上一篇博文中,向大家介绍了Users App和Index的前端部分的实现,以及前端与Django的通信部分.至此,我们的博客已经具备一个简单的雏形,可以将其部署在本地的服务器上了.目前较为流行的we ...

  2. openwrt 控制gpio口的方法

    利用i2c来控制gpio口 1.编译驱动或者安装驱动 # opkg update # opkg install kmod-i2c-gpio-custom kmod-i2c-core# 加载驱动 # i ...

  3. jsp有哪些内置对象作用分别是什么 分别有什么方法?

    JSP共有以下9个内置的对象: request 用户端请求,此请求会包含来自GET/POST请求的参数 response 网页传回用户端的回应 pageContext 网页的属性是在这里管理 sess ...

  4. xpath相关巩固

    python爬虫xpath的语法 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 ...

  5. UVA11019 Martix Matcher --- AC自动机

    UVA11019 Martix Matcher 题目描述: 给定一个\(n*m\)的文本串 问一个\(x*y\)的模式串出现的次数 AC自动机的奇妙使用 将\(x*y\)的模式串拆分成x个串,当x个串 ...

  6. [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)

    对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多 ...

  7. 二维数组sort排序

    和副本任务完全无关的奇怪感慨: 完全搞不懂我为什么会在搞图论的时候学这种奇怪东西,需要的时候不会,不需要的时候又莫名增加了奇怪的技能点. 之前的假期规划在十多天的放飞自我中彻底泡汤,简单的图论都一点不 ...

  8. Spring---介绍

    核心容器:Core.Beans.Context.EL模块 1.     Core模块:封装了框架依赖的最底层部分,包括访问资源.类型转换及一些常用工具类 2.     Beans模块:提供了框架的基础 ...

  9. CDOJ 1314 Hash Perfectly FFT

    Hash Perfectly 题目连接: http://acm.uestc.edu.cn/#/problem/show/1314 Description In computing, a hash ta ...

  10. HDU 5653 Bomber Man wants to bomb an Array. dp

    Bomber Man wants to bomb an Array. 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5653 Description ...