Android 实现计时器功能

  • 最近有个项目要实现记录时间推进的功能,之前百度了下,发现了android自带控件(Chronometer)可以实现这个功能,详见之前写的博客

http://blog.csdn.net/qq_21793463/article/details/49704121

  • 但是Chronometer的自带api太少,无法适应太复杂的场景,比如暂停后Chronometer其实还是在记录时间,也无法很好的记录时间的推移量,所以就看了下Chronometer源码,加上自己理解写了小demo同样实现了计时器的功能,而且比Chronometer的交互会好一点,主要是自己还可以自定义更多的操作。
    这里写图片描述
    这里写图片描述
  • 布局文件太简单,就是一个Textview和3个button,所以这里就不给出。
  • 直接看代码:
public class MainActivity extends Activity {

    private TextView tv_time;
    private Timer timer;
    private TimerTask timerTask;
    private int totalSec = 0;// 总共的秒值

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_time = (TextView) findViewById(R.id.tvTime);
    }

    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case 1:
                totalSec++;
                int hour = totalSec / 3600;//小时
                int min = totalSec / 60;//分钟
                if(min>=60){
                    min = min % 60;
                }
                int sec = totalSec % 60;//秒
                //格式化时间
                tv_time.setText(String.format("%1$02d:%2$02d:%3$02d", hour, min, sec));
                break;
            }
        }
    };

    public void onButtonClick(View v) {
        switch (v.getId()) {
        case R.id.btnStart:
            Toast.makeText(getApplicationContext(), "开始", 0).show();
            if (timer == null) {
                timer = new Timer(true);
            }
            if (timerTask == null) {
                timerTask = new TimerTask() {
                    @Override
                    public void run() {
                        handler.sendEmptyMessage(1);
                    }
                };
            }
            timer.schedule(timerTask, 1000, 1000);//延迟一秒执行任务,并每隔一秒在执行一次任务
            // timer.schedule(timerTask, 1000);//延迟一秒执行任务,不会重复执行
            break;

        case R.id.btnPause:
            Toast.makeText(getApplicationContext(), "暂停", 0).show();
            if (timerTask != null && timerTask != null) {
                timerTask.cancel();
                timerTask = null;
                timer.purge();// 会删除timer里面所有被cancel的task任务
            }
            break;
        case R.id.btnStop:
            Toast.makeText(getApplicationContext(), "停止", 0).show();
            if (timer != null && timerTask != null) {
                timerTask.cancel();
                timerTask = null;
                timer.cancel(); // 取消timer
                timer.purge(); 会删除timer里面所有被cancel的task任务
                timer = null;
                handler.removeMessages(1);//删除在消息队列里的消息
            }
            // 初始化时间
            totalSec = 0;
            tv_time.setText("00:00:00");
            break;
        }
    }

}
  • 代码也很简单,就是用timer 加 timerTask 和handler实现消息传递和任务的执行。
  • 对代码里面的一些地方解释一下,也以便以后查阅
    • timer.schedule(timerTask, 1000, 1000);//延迟一秒执行任务,并每隔一秒在执行一次任务
      源码解释:Schedule a task for repeated fixed-delay execution after a specific delay.
      (安排一个特定的任务重复的延迟执行)
    • timer.schedule(timerTask, 1000);//延迟一秒执行任务,不会重复执行
      源码解释:Schedule a task for single execution after a specified delay
      (安排一个特定任务延迟执行)
    • timer.purge(); // 会删除timer里面所有被canceled的task任务
      源码解释:Removes all canceled tasks from the task queue. If there are no other references on the tasks, then after this call they are free to be garbage collected.
      (从任务队列中删除所有已取消的任务。如果没有其他引用的任务,那么在此之后调用他们是免费的垃圾收集。)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值