Android用5种方式实现自定义计时器, 哪种才是你的菜?

Chronometer和CountDownTimer计时器 github传送门


效果图

看下效果图, 这是五种不同的方式演示计时器. 当然不看源码是看不出差别的.

效果图


前言

这次的文章不知道能不能帮助大家, 但是对我自己的帮助还是蛮大的, 才知道自己原来用的方法不是最优而且也不是最简. 然后我之前有一篇文章是用官方控件和类实现的, 有兴趣可以看一下Chronometer和CountDownTimer计时器.


Timer + TimerTask + Handler

在TimerTask实例的run方法中用Handler实例发送消息, 用Timer实例启动计时器, 从0ms开始, 间隔1000ms.

case R.id.cv_start1:
    if (mTimer1 == null && mTask1 == null) {
        mTimer1 = new Timer();
        mTask1 = new TimerTask() {
            @Override
            public void run() {
                Message message = mHandler.obtainMessage(1);
                mHandler.sendMessage(message);
            }
        };
        mTimer1.schedule(mTask1, 0, 1000);
    }
    break;

case R.id.cv_stop1:
    if (mTimer1 != null) {
        mTimer1.cancel();
        mTimer1 = null;
    }
    if (mTask1 != null) {
        mTask1.cancel();
        mTask1 = null;
    }
    break;

Timer + TimerTask

比起第一种, 这种更Java, 但是可以少一个Handler实例.

if (mTimer2 == null && mTask2 == null) {
    mTimer2 = new Timer();
    mTask2 = new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mTvTime2.setText(getTime());
                }
            });
        }
    };
    mTimer2.schedule(mTask2, 0, 1000);
}

Handler

这种方法就直接告别Timer和TimerTask了, 通过Handler的发消息延迟sendMessageDelayed以及不同的消息内容(就是what值)解决问题.

case R.id.cv_start3: {
    Message message = mHandler.obtainMessage(2);
    mHandler.sendMessage(message);
}
break;

case R.id.cv_stop3: {
    Message message = mHandler.obtainMessage(3);
    mHandler.sendMessage(message);
}
case 2: {
    mTvTime3.setText(getTime());
    this.removeMessages(2);
    Message message = this.obtainMessage(2);
    this.sendMessageDelayed(message, 1000);
}
break;

case 3:
    this.removeMessages(2);
    break;

Thread + Handler

老朋友Thread + Handler, 原来经常这么写, 现在不了(手动滑稽).

/**
 * 启动线程
 */
private void startThread() {
    if (mThread == null) {
        mThread = new MyThread();
        mThread.start();
    }
}

/**
 * 停止线程
 */
private void stopThread() {
    if (mThread != null) {
        mThread.stop = true;
        mThread = null;
        Message message = mHandler.obtainMessage(5);
        mHandler.sendMessage(message);
    }
}

Handler + Runnable

最后一种我目前最喜欢. 你连what值都无需处理, 直接postDelayed设置时延, 然后交给实现Runnable接口的实例的run方法来做.

case R.id.cv_start5: {
    if (mRunnable == null) {
        mRunnable = new MyRunnable();
        mHandler.postDelayed(mRunnable, 0);
    }
}
break;

case R.id.cv_stop5: {
    mHandler.removeCallbacks(mRunnable);
    mRunnable = null;
}
break;
private class MyRunnable implements Runnable {
    @Override
    public void run() {
        mTvTime5.setText(getTime());
        mHandler.postDelayed(this, 1000);
    }
}

最后

总之一点, 用第三种Handler和第五种Handler + Runnable肯定比其它的消耗少得多, 所以很推荐. 或者你还有更棒的方法可以评论区告诉我下. 喜欢记得点赞, 暗中关注我也是可以的哦~


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

2K70
来自专栏飞扬的花生

在ASP.MVC中使用Ajax

      Asp.net MVC 抛弃了Asp.net WebForm那种高度封装的控件,让我们跟底层的HTML有了更多的亲近。可以更自由、更灵活的去控制HT...

23890
来自专栏Java技术分享圈

杨老师课堂之Excel VBA 程序开发第六讲 根据制定列创建相应工作表及数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/deta...

18550
来自专栏开发之途

Handler、Looper与MessageQueue源码解析

12650
来自专栏菩提树下的杨过

Flash/Flex学习笔记(46):正向运动学

所谓"正向运动学"通俗点讲就是把几个连接部件的一端固定起来,另一个端可以自由(向前/向外)运动。比如人的行走,单个下肢可以理解为脚连接小腿,小腿连接大腿,大腿连...

23460
来自专栏三好码农的三亩自留地

Android Handler实现原理探索

    Android Handler我们都很熟,也经常也用它,一般可以用Handler发送一个消息Message,或者Post一个Runnable对象,而且都...

18620
来自专栏linux驱动个人学习

高通HAL层之bmp18x.cpp

下面bmp18x sensor为例进行分析。 BMP18x Sensor: 我们以打开bmp180为例,代码为hardware\qcom\sensors\Bmp...

42870
来自专栏静默虚空的博客

JAVA 设计模式 备忘录模式

用途 备忘录模式 (Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 这样以后就可将该对象恢复到原先保存的状态...

21580
来自专栏c#开发者

XmlSerializerFactory Is Pretty Cool[转]

The XmlSerializerFactory is a new class in .NET 2.0 that provides a factory patt...

30540
来自专栏积累沉淀

Java设计模式(十九)----备忘录模式

备忘录模式 一、 概念 二、 结构 三、 分类 1.”白箱”备忘录模式的实现 2.“黑箱”备忘录模式的实现 3.“多重”检查点 4....

20590

扫码关注云+社区

领取腾讯云代金券