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, beginning after the specified delay.
void schedule(TimerTask task, long delay, long period)
第一个方法只执行一次;
第二个方式每隔period执行一次,delay表示每次执行的延时时间,其实主要表现在第一次的延时效果,比如delay设置为0,那么立马执行task内容,如果设置为1000,那么第一次执行task会有一秒的延时效果。
2) TimerTask用于继承(或者直接定义并初始化匿名类),并重写run方法,定义自己的业务逻辑。
3) 手动结束定时器,
Timer和TimerTask都有cancel方法,而且最好同时调用;
如果已经cancel,下次必须创建新的Timer才能schedule。
4) 如果你在当前的activity中schedule了一个task,但是没有等到task结束,就按Back键finish了当前的activity,Timer和TimerTask并不会自动cancel或者销毁,它还会在后台运行,此时如果你在task的某个阶段要调起一个控件(比如AlertDialog),而该控制依赖被销毁的activity,那么将会引发crash。
5) 例如对进度条实现每一秒递增的效果(主要代码)
Java代码 收藏代码
//总时长
private static final long TOTAL_QUERY_MINUTES = 50;
//比如每5秒去查询数据库
private static final long QUERY_INTERVAL = 5 *1000;
private static final int TIMER_SCHEDULE_CODE = 1;
int timePassed=0;
QueryTimerTask queryTask;
private Timer timer;
//显示定时器的效果
ProgressBar statusBar;
private Handler mHandler= new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case TIMER_SCHEDULE_CODE:
statusBar.setProgress(timePassed);
//Log.w(TAG, "timePassed : " + timePassed + " -- TOTAL_QUERY_MINUTES : " + TOTAL_QUERY_MINUTES);
if (timePassed>=TOTAL_QUERY_MINUTES){
if (timer != null)
timer.cancel();
if (queryTask != null)
queryTask.cancel();
new AlertDialog.Builder(YourActivity.this).
setTitle("超时通知").setMessage("已超时,是否继续等待?")
.setPositiveButton("继续等待", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
reSchedule();
}
})
.setNegativeButton("取消任务", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//cancelTask();
}
}).show();
break;
//....
}
return true;
}
});
void reSchedule() {
timePassed = 0;
if (timer != null) {
timer.cancel();
}
if (queryTask != null) {
queryTask.cancel();
}
timer = new Timer();
queryTask = new QueryTimerTask();
//每一秒执行一次,第一次有延时一秒的效果
timer.schedule(queryTask, 1000, 1000);
}
//自定义task
class QueryTimerTask extends TimerTask {
@Override
public void run() {
//比如每过QUERY_INTERVAL去查询信息
if ((timePassed * 1000) % QUERY_INTERVAL == 0) {
//query();
}
timePassed++;
//通知handler去改变statusBar
Message message = mHandler.obtainMessage();
message.what = TIMER_SCHEDULE_CODE;
mHandler.sendMessage(message);
}
}
2. 倒计时
其实也可以用上面的方法实现,
安卓额外提供了CountdownTimer类,以后再补充
文章来源:http://itlanbao.com/preview.aspx#1,0
Android计时器和倒计时的更多相关文章
- android 计时器,倒计时
自己定义CountDownTimer /** * 计时器 * @author Administrator * */ class TimeCount extends CountDownTimer{ pu ...
- Android使用CountDownTimer倒计时
1.布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android ...
- 拓展 Android 原生 CountDownTimer 倒计时
拓展 Android 原生 CountDownTimer 倒计时 [TOC] CountDownTimer 在系统的CountDownTimer上进行的修改,主要是拓展了功能,当然也保留了系统默认的模 ...
- Android计时器TimerTask,Timer,Handler
Android计时器TimerTask,Timer,若要在TimerTask中更新主线程UI,鉴于Android编程模型不允许在非主线程中更新主线程UI,因此需要结合Android的Handler实现 ...
- Chronometer控件实现的Android计时器
本文为大家演示了如何使用Chronometer控件实现Android计时器的实例. 先贴上最终的实现效果图: Android计时器实现思路 使用Chronometer控件实现计器的操作.通过设置set ...
- Android 获取验证码倒计时实现
Android 获取验证码倒计时实现 2017年10月24日 09:55:41 FBY展菲 阅读数:2002 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- Android 在线订单倒计时设计
接到一个需求,用户下单后,商店这边需要显示在线订单列表,订单十分钟内有效.于是需要设计倒计时,显示每个订单剩余处理时间. 倒计时剩余时间: 订单创建时间 + 10分钟 - 系统当 ...
- Android中实现倒计时
1.需求 弹出提示的dialog,实现倒计时,结束后关闭dialog 2.dialog界面布局 <?xml version="1.0" encoding="utf- ...
- [Android Pro] CountDownTimer倒计时
定时执行在一段时候后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知(译者:触发onTick方法),下面的例子显示在一个文本框中显示一个30s倒计时: new CountdownTimer(3 ...
随机推荐
- ZooKeeper Installation(Dev)
ZooKeeper Installation Install ZooKeeper packages # -jre-headless # sudo apt-get install zookeeper z ...
- courator - create
0. retry policy RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,3); 1. client 1) recipes ...
- Linux性能及调优指南1.2之Linux内存架构
本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.2节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...
- Android轮询器,RxJava Interval;
基于RxJava实现轮询器,配合Retrofit处理网络请求轮询很好用,其它的一些轮询也都可以使用像Bannre图之类的: implementation 'io.reactivex.rxjava2:r ...
- TP5实现邮件发送(PHP 利用QQ邮箱发送邮件「PHPMailer」)
在 PHP 应用开发中,往往需要验证用户邮箱.发送消息通知,而使用 PHP 内置的 mail() 函数,则需要邮件系统的支持. 如果熟悉 IMAP/SMTP 协议,结合 Socket 功能就可以编写邮 ...
- 初识vuejs
转行前端,时间也不短了,也见识到了前端行业的蓬勃发展,以及一些新鲜技术的层出不穷. 由于自身计算机基础的薄弱,更加上一直没有遇上一个公司力推新技术,所以一直以来基本上都是靠着jquery和则zepto ...
- centos安装dlib
小心这个错误 c++: 编译器内部错误:已杀死(程序 cc1plus) # 内存不足,可解决的 复制如下命令: yum install cmake python-devel numpy gcc ...
- mybatis foreach 循环 list(map)
直接上代码: 整体需求就是: 1.分页对象里面有map map里面又有数组对象 2.分页对象里面有list list里面有map map里面有数组对象. public class Page { pri ...
- ElasticSearch 2 (1) - Getting Start
ElasticSearch 2.1.1 (1) - Getting Start Install & Up cd elasticsearch-2.1.1/bin ./elasticsearch ...
- [Android] 使用ViewPager 实现导航
转载请标注:转载于http://www.cnblogs.com/Liuyt-61/p/6582667.html -------------------------------------------- ...