-
2021-05-26 17:56:08
其实是定时周期性任务
本文将介绍五种 Android 实现倒计时的方法,对就是发送短信验证码后的倒计时那种。其实就是执行定时周期性的任务的五种方式,包括但不限于实现倒计时功能。这五种方式分别是:
handler+postDelayed() 方式
Timer + TimerTask + handler 方式
ScheduledExecutorService + handler 方式
RxJava 方式
CountDownTimer 方式
其中 Timer 的方式实现定时任务,这儿用来做倒计时是没有问题的。但是如果用来执行周期任务,恰好又有多个任务,恰好两个任务之间的时间间隔又比前一个任务执行时间短就会发生定时不准确的现象了。Timer 在执行过程中如果任务跑出了异常,Timer 会停止所有的任务。Timer 执行周期任务时依赖系统时间,系统时间的变化会引起 Timer 任务执行的变化。额。。。。问题貌似还挺多,所以我们用其他四种方式吧(手动滑稽)。
自定义的 handler
几种方式都会用到的 handler 放前面,避免 handler 引起的内存泄露,使用 handler 时建议按如下方式让 handler 持有一个当前 Activity 的弱引用:
/**
* handler 持有当前 Activity 的弱引用防止内存泄露
*/
private static class LooperHandler extends Handler {
WeakReference mWeakReference;
LooperHandler(LoopersActivity activity) {
mWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
LoopersActivity loopersActivity = mWeakReference.get();
switch (msg.what) {
case 0:
loopersActivity.mTvValue.setText(String.valueOf(TOTAL_TIME_SEC));
if (TOTAL_TIME_SEC <= 0) {
loopersActivity.scheduled.shutdown();
loopersActivity.mTvValue.setText(loopersActivity.getResources().getString(R.string.done));
loopersActivity.mStart.setEnabled(true);
loopersActivity.mStart.setBackgroundColor(Color.parseColor("#f97e7e"));
}
TOTAL_TIME_SEC--;
break;
case 1:
loopersActivity.mTvValue.setText(String.valueOf(TOTAL_TIME_SEC));
if (TOTAL_TIME_SEC <= 0) {
loopersActivity.timer.cancel();
loopersActivity.timer = null;
loopersActivity.mTvValue.setText(loopersActivity.getResources().getString(R.string.done));
loopersActivity.mStart.setEnabled(true);
loopersActivity.mStart.setBackgroundColor(Color.parseColor("#f97e7e"));
}
TOTAL_TIME_SEC--;
break;
case 2:
loopersActivity.mHandler.postDelayed(loopersActivity.mRunnable, ONECE_TIME);
loopersActivity.mTvValue.setText(String.valueOf(TOTAL_TIME_SEC));
if (TOTAL_TIME_SEC <= 0) {
loopersActivity.mHandler.removeCallbacks(loopersActivity.mRunnable);
loopersActivity.timer = null;
loopersActivity.mTvValue.setText(loopersActivity.getResources().getString(R.string.done));
loopersActivity.mStart.setEnabled(true);
loopersActivity.mStart.setBackgroundColor(Color.parseColor("#f97e7e"));
}
TOTAL_TIME_SEC--;
break;
}
}
}
handler&postDelayed()
这个算是比较传统的定时方式了,发送指定延时的消息来达到定时周期执行的目的。
/**
* handler_postDelayed 方法实现
*/
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
Message msg = mHandler.obtainMessage(2);
mHandler.sendMessage(msg);
}
};
// handler+postDelayed 方式,反复发送延时消息
private void handlerPostDelayed() {
mHandler.postDelayed(mRunnable, ONECE_TIME);
}
Timer&TimerTask
通过 timer 执行周期延时的任务,handler 中将计时信息更新,并在计时结束时结束 timer 的周期任务
/**
* TimkerTask 方式实现
*/
private Timer timer;
private void timerTask() {
timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
Message message = mHandler.obtainMessage(1);
mHandler.sendMessage(message);
}
};
timer.schedule(task, 0, ONECE_TIME);
}
ScheduledExecutorService
此方式中 handler 功能与 timer 方式一致
/**
* ScheduledExecutorService 方式实现
*/
private ScheduledExecutorService scheduled;
private void scheduledExecutorService() {
//初始化一个线程池大小为 1 的 ScheduledExecutorService
scheduled = new ScheduledThreadPoolExecutor(1);
mStart.setEnabled(false);//在发送数据的时候设置为不能点击
mStart.setBackgroundColor(Color.GRAY);//背景色设为灰色
scheduled.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Message msg = mHandler.obtainMessage(0);
mHandler.sendMessage(msg);
}
}, 0, ONECE_TIME, TimeUnit.MILLISECONDS);
}
RxJava
此方法通过 RxJava 的 interval 操作符来实现延时发送消息。接受消息的观察者将计时信息更新到 textview 中。此方法主要涉及到一些 RxJava 操作符以及线程切换,代码中也进行了注释。
/**
* RxJava 方式实现
*/
private void rxJava() {
final long count = TOTAL_TIME / 1000;
Observable.interval(0, 1, TimeUnit.SECONDS)//设置0延迟,每隔一秒发送一条数据
.take((int) (count + 1)) //设置总共发送的次数
.map(new Func1() {//long 值是从小到大,倒计时需要将值倒置
@Override
public Long call(Long aLong) {
return count - aLong;
}
})
.subscribeOn(Schedulers.computation())
// doOnSubscribe 执行线程由下游逻辑最近的 subscribeOn() 控制,下游没有 subscribeOn() 则跟Subscriber 在同一线程执行
//执行计时任务前先将 button 设置为不可点击
.doOnSubscribe(new Action0() {
@Override
public void call() {
mStart.setEnabled(false);//在发送数据的时候设置为不能点击
mStart.setBackgroundColor(Color.GRAY);//背景色设为灰色
}
})
.observeOn(AndroidSchedulers.mainThread())//操作UI主要在UI线程
.subscribe(new Subscriber() {
@Override
public void onCompleted() {
mTvValue.setText(getResources().getString(R.string.done));
mStart.setEnabled(true);
mStart.setBackgroundColor(Color.parseColor("#f97e7e"));
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(Long aLong) { //接收到一条就是会操作一次UI
String value = String.valueOf(aLong);
mTvValue.setText(value);
}
});
}
CountDownTimer
这货应该是实现倒计时功能最简单的方式了,直接使用 Android SDK 中的 CountDownTimer 类
/**
* CountDownTimer 实现倒计时
*/
private CountDownTimer countDownTimer = new CountDownTimer(TOTAL_TIME, ONECE_TIME) {
@Override
public void onTick(long millisUntilFinished) {
String value = String.valueOf((int) (millisUntilFinished / 1000));
mTvValue.setText(value);
}
@Override
public void onFinish() {
mTvValue.setText(getResources().getString(R.string.done));
}
};
//调用 CountDownTimer 对象的 start() 方法开始倒计时,也不涉及到线程处理
countDownTimer.start();
最后
以上五种倒计时(定时周期任务)方式就介绍完了,需要源码可以去 MvpDemo 中查看,本 Demo 持续更新欢迎 star
觉得本文对你有帮助
简书PandaQ404
掘金PandaQ
GithubPandaQAQ
更多相关内容 -
C#10秒倒计时软件
2018-01-31 17:08:14C#10秒倒计时软件,10秒倒计时,会有十次铃声提醒,运用timer实现,且倒计时间可编辑 -
倒计时器源代码(C#)
2016-10-31 19:31:33倒计时器 -
C# 倒计时(可实现输入XX分XX秒的倒计时)
2013-08-23 15:20:03可实现输入XX分XX秒的倒计时,如2分30秒,1分钟,30秒等均可实现 -
JS实现十分钟倒计时代码实例
2021-01-19 15:54:29举例:10分钟考试倒计时,当时间仅剩五分钟时,提醒考试仅剩5分钟,时间结束时,提示考试结束。具体代码如下: HTML部分: <body> <div id=timer></div> <div id=warring></div> </body> JavaScript... -
JS小案例--关于时间--十分钟倒计时
2019-03-18 20:10:21JS小案例–关于时间–十分钟倒计时 界面和实现功能 功能:emmmmmm就是倒计时 用到的知识点 Math.floor():根据“floor”的字面意思“地板”去理解; 里面的数都往小了取整数 (看到的特别容易理解)例如: Math....JS小案例–关于时间–十分钟倒计时
界面和实现功能
功能:emmmmmm就是倒计时用到的知识点
-
Math.floor():根据“floor”的字面意思“地板”去理解;
里面的数都往小了取整数(看到的特别容易理解)例如:
Math.floor(11.46)=Math.floor(11.68)=Math.floor(11.5)=11
Math.floor(-11.46)=Math.floor(-11.68)=Math.floor(-11.5)=-12 -
定时器 实时时间已经介绍了 可去那寻找
思路
1.设定一个时间 如10分钟 60*10s
利用取余除法等求出 分钟 秒钟2.利用定时器 每秒 maxTime- - 从而达到倒计时效果
3.优化 假如秒钟小于10 那么就+0(利用函数 实时时间已经介绍了 可去那寻找)
代码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>十分钟倒计时</title> <style type="text/css"> *{ margin:0; padding:0; } #dv{ height:20px; width:300px; text-align: center; border:1px solid forestgreen; margin:100px auto; } </style> </head> <body> <div id="dv"></div> <script type="text/javascript"> var dv=document.getElementById("dv"); var maxTime=60*10; function jia(a){ if(a<10) return "0"+a; else return a; } var last=function(){ var minutes=Math.floor(maxTime/60); //怎么说呢 假如(60*10-1)s 正常应该就是的 9.983333 取整就是 9 var seconds=maxTime%60; //余数指定是个整数 seconds=jia(seconds); var mes="还剩下"+minutes+"分"+seconds+"秒"; dv.innerHTML=mes; maxTime--; if(maxTime==0) { // clearInterval(timeId); alert("time is over!"); } } setInterval(function(){ last(); },1000); </script> </body> </html>
-
-
JS如何实现分钟倒计时(十分钟倒计时实例)
2021-03-23 12:20:15这篇文章和大家分享一个JS十分钟倒计时代码,非常简单实用,感兴趣的朋友可以看看。编写JS倒计时代码需要用到很多JavaScript知识,比如:if函数,Math.floor,定时器setInterval等等,如有不清楚的小伙伴可以参考PHP...工作中经常需要在页面中设置倒计时,那你知道JS如何实现分钟倒计时吗?这篇文章和大家分享一个JS十分钟倒计时代码,非常简单实用,感兴趣的朋友可以看看。
编写JS倒计时代码需要用到很多JavaScript知识,比如:if函数,Math.floor,定时器setInterval等等,如有不清楚的小伙伴可以参考PHP中文网的相关文章,或者访问 JavaScript视频教程。
举例:10分钟考试倒计时,当时间仅剩五分钟时,提醒考试仅剩5分钟,时间结束时,提示考试结束。具体代码如下:
HTML部分:
JavaScript部分:
var maxtime = 10 * 60; //
function CountDown() {
if (maxtime >= 0) {
minutes = Math.floor(maxtime / 60);
seconds = Math.floor(maxtime % 60);
msg = "距离结束还有" + minutes + "分" + seconds + "秒";
document.all["timer"].innerHTML = msg;
if (maxtime == 5 * 60)alert("距离结束仅剩5分钟");
--maxtime;
} else{
clearInterval(timer);
alert("时间到,结束!");
}
}
timer = setInterval("CountDown()", 1000);
JS十分钟倒计时代码的具体步骤:
1、设置考试时长maxtime = 10 * 60秒,即10分钟
2、用if函数判断,当maxtime大于等于零时,判断剩余分和秒
3、再用if函数判断,当时间仅剩5分钟时,弹出提示:距离结束仅剩5分钟
4、如果时间到,则清除定时器,提示:结束
效果如图所示:
以上给大家分享了一个JS倒计时十分钟的代码,步骤很详细,容易理解,初学者可以自己动手尝试,看看能不能实现倒计时的效果,希望这篇文章对你有所帮助!
【相关教程推荐】
-
vue中倒计时的用法
2020-12-29 08:14:52后台传递过来创建时间,前端进行倒计时十分钟,十分钟之后更改订单状态 把待支付改为过期或者其他 来验证订单状态{{text}} {{Countdown(record.countDown)}}//订单状态(未提交) 将毫秒数转化为分+秒this.$axios....后台传递过来创建时间,前端进行倒计时十分钟,十分钟之后更改订单状态 把待支付改为过期或者其他 来验证订单状态
{{text}} {{Countdown(record.countDown)}}
//订单状态(未提交) 将毫秒数转化为分+秒
this.$axios.post('url',this.orderData,
{
headers:{
'token':localStorage.getItem('token')
}
}).then(res=>{
//我们在请求过来后台数据中就先处理时间
let times = Date.parse(new Date()) //当前时间,本来应该由后台传回服务器时间,但是后台没有传,暂时已浏览器本机时间来计算
let expires = 10*60*1000 //有效时长,默认是10分钟,本来应该由后台给出,但是后台没给,暂时写死
for ( let i = 0 ; i
res.data.results.rows[i].countDown = 0 //在rows里面添加一个属性 cuntDown来计算两个时间之间的差值
if(res.data.results.rows[i].orderStatus =="待支付"){
res.data.results.rows[i].countDown = expires - (times - res.data.results.rows[i].createTime)
//当前时间减去创建时间 得到差值 十分钟减去差值 差值小于0 订单已过期
if(res.data.results.rows[i].countDown < 0){
res.data.results.rows[i].orderStatus = "过期" //此处可以修正后端没有及时设置为已过期的问题
}
}
}
this.data=res.data.results.rows
if(this.interval){ //判断定时器这个属性是否为空,存在则清除
clearInterval(this.interval)
}
this.interval = setInterval(() => { //这个interval是在data(){return{}} 中创建,初始化为null 防止重复请求到这个页面定时器重复生成
for ( let i = 0 ; i
if(this.data[i].orderStatus =="待支付"){
this.data[i].countDown = this.data[i].countDown - 1000 //data.countDown 这个新属性上面更改,不会影响视图层
if(this.data[i].countDown < 0){
this.data[i].orderStatus = "过期" //倒计时结束后设置过期
}
}
}
}, 1000);
相应的处理函数
Countdown(time) {
//将传递过来的时间戳差值转化为时分形式
let ts = time
let days = parseInt(ts / (1000 * 60 * 60 * 24));
let hours = parseInt((ts % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutes = parseInt((ts % (1000 * 60 * 60)) / (1000 * 60));
let seconds = (ts % (1000 * 60)) / 1000;
let str = `${seconds}秒`;
if(minutes > 0){
str = `${minutes}分钟${seconds}秒`
}
return str
},
-
python实现倒计时小工具
2021-02-09 08:58:06本文实例为大家分享了python实现倒计时小工具的具体代码,供大家参考,具体内容如下#!/usr/bin/env python# coding=utf-8import threadingimport timeimport Queuefrom Tkinter import *import tkMessageBoximport ... -
C#实现倒计时
2018-10-04 22:06:11一、效果 二、实现代码 DateTime dtNow, dtSet;//定义两个DateTime类型的变量,分别用来记录当前时间和设置的到期时间 private void Form1_Load(object ...//设置timer1计时器的执行时间间隔 timer1.Enabled = tr... -
Android开发CountDownTimer轻松实现倒计时功能的方法
2021-06-03 10:55:06CountDownTimer由系统提供查资料的时候 发现了CountDownTimer这个类之后 果断抛弃了以前的倒计时做法功能:30秒倒计时 每次间隔1秒参数:mc.start();方法开始mc.cancel();方法结束new MyCountDownTimer(30000, 1000); ... -
C# 如何使用倒计时
2018-12-30 08:57:37平时做程序的时候,经常会需要设计一个延时触发的事件,之前在网吧玩到只剩20分钟的时候会弹出一个余额不足的...2.增加倒计时的方法 void procTimer_Tick(object sender, EventArgs e) { procTimer.Stop(); Sou... -
jquery ------ 分钟倒计时
2020-05-13 14:33:37<span class="cuclock">15:00</span> /** * 倒计时 ... * 例:倒计时10分钟 var cutTime = 10 * 60 **/ var cutTime = 15 * 60; let summer = setInterval(counClock, 1000);. -
Android 倒计时实现,显示剩余时分秒
2019-10-14 18:08:06//倒计时效果展示 String formatLongToTimeStr = formatLongToTimeStr(leftTime); sureBtn.setText(formatLongToTimeStr); //每一秒执行一次 handler.postDelayed(this, 1000); } else {//倒计时... -
Android 使用 Timer 做倒计时。实现开始 (start),取消 (cancel),暂停 (pause),重开 (resume)功能
2021-06-02 14:53:00在 Android 使用 Timer 做倒计时。实现开始 (start),取消 (cancel),暂停 (pause),恢复 (resume)功能在 Android 开发中,我们很多地方会使用到倒计时功能。可以使用 Timer 做倒计时(ps:虽然我不建议)。Step00. ... -
十分钟倒计时九分八分五分PPT教案.pptx
2021-10-03 17:39:31十分钟倒计时九分八分五分PPT教案.pptx -
C# timer1倒计时60秒代码
2018-08-31 14:38:11int i = 60; private void timer1_Tick(object sender, EventArgs e) { if (i == 0) { timer1.Stop(); label1.Text = "... private void button1_Click(object sender, EventArgs e) ... -
10分钟计时器.ppt
2019-11-28 21:42:41用ppt+VBA实现的10分钟计时器,10分钟到振铃。ppt2013测试通过,主要用于计时场合的面试、汇报等 -
自定义View之倒计时
2015-11-29 14:11:56需求: ...为了不多次写这个获取验证码的接口,下面...分析一下,这是一个TextView,点击的时候变色,不能再点击,同时里面的倒计时开始显示。那么就有了下面的代码 代码: /** * 通过selector选择器来改变背景, -
十分钟倒计时flash_Flash 101-第6部分:最终倒计时
2020-07-29 22:31:28十分钟倒计时flash 音乐的声音 (The Sound Of Music) Well, we’re almost at the end of this wild ride I like to call Flash 101. If you’ve been following along, you’re probably heaving a sigh of relief ... -
flash 倒计时swf以及源代码
2010-07-10 00:57:42这是一个flash制作并且用代码编写的倒计时 -
vue 实现分钟倒计时
2021-07-16 06:29:41实现 首先,是两个div用来显示...然后,是倒计时函数countdown //倒计时 countdown () { const end = Date.parse(new Date('2020-05-05 03:59:23')) const now = Date.parse(new Date()) const msec = end - n... -
单片机10分钟(带暂停)倒计时程序
2021-05-26 03:56:12ORG 0000HAJMP MAINORG 000BHAJMP INTT0ORG 0030HMAIN:MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HMOV DPTR,#TABSETB EASETB ET0SETB TR0L2: MOV R7,#00HL1: MOV A,#0MOV B,#10DIV ABSETB P2.2SETB P2.1SETB P2.0MOVC..... -
1分钟3分钟5分钟十分钟表盘式倒计时器
2014-04-07 23:20:111分钟3分钟5分钟十分钟表盘式倒计时器 -
微信小程序页面倒计时
2021-11-19 10:17:14秒杀列表页有n条商品参加倒计时,那么此时vue中写的倒计时可以直接用到小程序中吗,答案是ofcourse,当然能~ 下面是处理数据列表里面的倒计时 queryEventList() { let _this = this let args = { shopId: $....