Java/Android计时器(开始,暂停,恢复,停止)

由于要做暂停和恢复,这里我就没有使用Android的CountDownTimer,而是用了Java的Timer。所以,这个方法在java肯定是通用。我也外加了Android独有的Service,有些计时器需要在Activiy关闭的情况下依然在计时,回到Activity时,显示当前的计时状态。

Timer 这个Java的类,具体看Java的API说明,但是要注意一点:

Timer 在cancel后,需要重新new 一次。

首先要给计时器定义三个状态:准备,开始,暂停。

    public static final int PREPARE = 0;
    public static final int START = 1;
    public static final int PASUSE = 2;

1.准备:没有开始计时,最初始状态;

2.开始:已经开始倒计时

3.暂停:已经开始倒计时,而且用户点击了暂停

开始、恢复倒计时,我定义了这个方法:

    /**
     * start count down
     */
    private void startTimer(){
        timer = new Timer();
        timerTask = new MyTimerTask();
        timer.scheduleAtFixedRate(timerTask, 0, timer_unit);
    }

timer_unit 就是执行timer 任务的时间,我定义为1秒。MyTimerTask是我定义的一个倒计时计算方法,如下:

    /**
     * count down task
     */
    private class MyTimerTask extends TimerTask{

        @Override
        public void run() {
            timer_couting -=timer_unit;
            if(timer_couting==0){
                cancel();
                initTimerStatus();
            }
            mHandler.sendEmptyMessage(1);
        }
    }

timer_couting 是一个变量,记录当前倒计时还剩余多少时间,当剩余时间为0时,倒计时结束,所以cancel结束倒计时。每次倒计一秒通过handler发送到主线程来更新ui提示倒计时信息。

在界面上定义两个按钮,一个开始,一个停止,开始后可以暂停,暂停后可以恢复。

          case R.id.btn_start:
                switch (timerStatus){
                    case CountDownTimerUtil.PREPARE:
                        startTimer();
                        timerStatus = CountDownTimerUtil.START;
                        btnStart.setText("PAUSE");
                        break;
                    case CountDownTimerUtil.START:
                        timer.cancel();
                        timerStatus = CountDownTimerUtil.PASUSE;
                        btnStart.setText("RESUME");
                        break;
                    case CountDownTimerUtil.PASUSE:
                        startTimer();
                        timerStatus = CountDownTimerUtil.START;
                        btnStart.setText("PAUSE");
                        break;
                }
                break;
            case R.id.btn_stop:
                if(timer!=null){
                    timer.cancel();
                    initTimerStatus();
                    mHandler.sendEmptyMessage(1);
                }

对于Android应用中需要用到关闭了Activity后依然在计时,在这里我们需要用Service,定义Service的情况跟上面类同,但是要注意的是这个计时Service是要单例模式,保证每次倒计时进来都是同一个倒计时。还需要定义一些方法来让Activity给这个Service传递操作命令,开始,暂停,恢复,停止。

    /**
     * start
     */
    public void startCountDown(){
        startTimer();
        timerStatus = CountDownTimerUtil.START;
    }

    /**
     * paust
     */
    public void pauseCountDown(){
        timer.cancel();
        timerStatus = CountDownTimerUtil.PASUSE;
    }

    /**
     * stop
     */
    public void stopCountDown(){
        if(timer!=null){
            timer.cancel();
            initTimerStatus();
            mCountDownTimerListener.onChange();
        }
    }

在Activity里面获取这个Service

countDownTimerService = CountDownTimerService.getInstance(new MyCountDownLisener()
                ,service_distination_total);

项目源码:https://github.com/arjinmc/Android-CountDownTimer

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 10:29:33

Java/Android计时器(开始,暂停,恢复,停止)的相关文章

Android计时器TimerTask,Timer,Handler

Android计时器TimerTask,Timer,若要在TimerTask中更新主线程UI,鉴于Android编程模型不允许在非主线程中更新主线程UI,因此需要结合Android的Handler实现在Java的TimerTask中更新主线程UI. 现给出一个简单示例.代码使用标准Java的TimerTask和Timer启动一个计时器Task.该任务每隔2秒更新主线程的UI(在主线程的TextView显示最新的系统时间:System.currentTimeMillis()). package z

Chronometer控件实现的Android计时器

本文为大家演示了如何使用Chronometer控件实现Android计时器的实例. 先贴上最终的实现效果图: Android计时器实现思路 使用Chronometer控件实现计器的操作.通过设置setBase(long base)来设置初始时间,然后为其添加一个 setOnChronometerTickListener(Chronometer.OnChronometerTickListener l)事件来判断时间是否到了,然后再调用其stop()方法实现停止计时. Android计时器实现代码

【转】android错误 aapt.exe已停止工作的解决方法

http://www.jb51.net/article/57420.htm 在使用eclipse进行安卓java的编程的时候,有时候我们会遇到这样的问题:那就是无故弹出aapt.exe停止工作的提示,虽然程序不会崩溃,但是这个提示经常弹出很是烦人.今天,小编就来教大家aapt.exe停止工作如何解决 android异常——aapt.exe已停止工作在android开发时,当build项目时,发生如下异常:aapt.exe已停止工作,其他无任何错误提示,发生这个错误一般是资源文件或是xml文件中有

java/android 设计模式学习笔记(16)---命令模式

这篇博客我们来介绍一下命令模式(Command Pattern),它是行为型设计模式之一.命令模式相对于其他的设计模式更为灵活多变,我们接触比较多的命令模式个例无非就是程序菜单命令,如在操作系统中,我们点击关机命令,系统就会执行一系列的操作,如先是暂停处理事件,保存系统的一些配置,然后结束程序进程,最后调用内核命令关闭计算机等,对于这一系列的命令,用户不用去管,用户只需点击系统的关机按钮即可完成如上一系列的命令.而我们的命令模式其实也与之相同,将一系列的方法调用封装,用户只需调用一个方法执行,那

Android计时器和倒计时

Android计时器和倒计时 计时器 两个核心类 Timer 和 TimerTask 1) Timer核心方法 Java代码 //Schedules the specified task for execution after the specified delay. void schedule(TimerTask task, long delay) //Schedules the specified task for repeated fixed-delay execution, beginn

Unity3D游戏开发之从"复活"和"暂停/恢复"谈游戏数据配置管理

随着游戏制作技术的不断发展,在经历了从2D到3D.从单机到网游.从PC游戏到移动游戏的种种演变后,玩家对于游戏质量的要求越来越高,游戏制作的难度相应地增加,整个游戏研发的体系开始变得庞大而复杂,由此就产生了游戏数据配置和管理的相关问题.本文将从游戏中的"复活"和"暂停/恢复"这两个应用场景的角度来谈谈在游戏开发中如何对游戏中的数据进行管理和配置. 为什么要谈游戏数据的配置和管理 不知道大家是不是会和博主有一样的想法,就是当你回头来思考游戏开发的时候,你常常会发现,如

java/android 设计模式学习笔记(5)---对象池模式

这次要介绍一下对象池模式(Object Pool Pattern),这个模式为常见 23 种设计模式之外的设计模式,介绍的初衷主要是在平时的 android 开发中经常会看到,比如 ThreadPool 和 MessagePool 等. 在 java 中,所有对象的内存由虚拟机管理,所以在某些情况下,需要频繁创建一些生命周期很短使用完之后就可以立即销毁,但是数量很大的对象集合,那么此时 GC 的次数必然会增加,这时候为了减小系统 GC 的压力,对象池模式就很适用了.对象池模式也是创建型模式之一,

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过