重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
开发中经常遇到用计时器的时候,例如:每秒输出一次log,这时候就要用到延时操作,这里总结了几种常用的方法。
十余年品牌的成都网站建设公司,超过千家企业网站设计经验.价格合理,可准确把握网页设计诉求.提供定制网站建设、购物商城网站建设、微信小程序、响应式网站开发等服务,我们设计的作品屡获殊荣,是您值得信赖的专业网站设计公司。
AlarmManager 是Android的全局定时器,可以在指定时间执行定时任务。定时任务通过PendingIntent 的 getActivity()、getService()或 getBroadcast() 来执行。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent出来,在接收到设定的Intent时执行定时任务。
(2) setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
该方法用于设置重复闹钟,其中参数说明如下:
type:闹钟类型
startTime:首次执行闹钟的时间
intervalTime:两次执行闹钟的时间间隔
pi:闹钟响应动作
(3) setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
该方法也用于设置重复闹钟,与第二个方法相似,区别在于其两次闹钟执行的间隔时间不是固定的。
AlarmManager实现定时的方法,我还没有用到过,以上内容是在网上查找资料后自己在一个小demo中小小试验了的,有错误或描述不清的地方请见谅。下面是我参考的介绍AlarmManager的三篇文章。
类似iOS中的NSTimer 定时器功能,开关控制随机几秒钟执行指定功能;
平台:Android
开发环境:android Studio
代码实现:
一. 创建Handler对象和Runnable对象
[java] view plain copy print?
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (mPageOpen){
if (interstitialAd.isLoaded()){ //示例-谷歌插页广告
interstitialAd.show();
}else {
AdRequest adRequest = new AdRequest.Builder().build();
interstitialAd.loadAd(adRequest);
}
int random = (int)(Math.random() * 10 +20)*1000; //随机时间循环执行
handler.postDelayed(this, random);
}
}
};
二. 开关控制
[java] view plain copy print?
Switch mSwith = (Switch) findViewById(R.id.switchPage);
mSwith.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
mPageOpen = true;
} else {
mPageOpen = false;
}
handler.postDelayed(runnable, 15000); //开关控制执行
}
});
三. 移除定时器
[java] view plain copy print?
handler.removeCallbacks(runnable);
不会。安卓实现同时多个倒计时效果的步骤:
1、首先需要在输入框中输入一个秒数,比如:12,然后获取输入框中的值,显示在一个TextView中;
2、点击“开始倒计时”按钮,每隔一秒钟,秒数减1,然后显示在TextView中;
3、点击“停止倒计时”按钮,计时器停止运行,当再次点击“开始倒计时”按钮,计时器继续运行。
4、平时用的每个商品都应该有两个属性值,这里叫它deadLine和isOverdue吧,表示商品的到期时间和是否到期,那么倒计时可以考虑这么实现:设置一个主计时器,每隔1秒发出消息告诉GridView现在的时间,GridView的Item获得这个时间之后就和deadLine比较,如果已经到deadline了,就把数据源中的这项标记成已到期(修改isOverdue的值为true);没到deadline,就计算还差多少时间,显示到GridView的Item里。
android计时器,时间计算器的实现方法,需要的朋友可以参考一下
需求:默认为"00:00:00",点击开始按钮时清零后开始计时,出现如10:28:34。点击停止的时候停止计时。
问题:使用Calendar
DateFormat的方法,不设置时区获取到的小时是本地时区的(东八区的就是8),设置成GMT标准时区获取到的时间是12小时(12:00:00),设置24小时制无效。
在开始时间加减各种小时都无效,而且计时只能到12小时就自动跳上去了,始终无法出现默认状态00:00:00开始计时的效果。
尝试各种时间设置方法无效后只能自己写一个根据秒数转换时间格式字符串的方法了,经过测试是没问题的,两位数只能显示99小时为最大,如需要更大小时数需要改改方法。
另外小时数也不能无限大,超过long数据类型长度会变成负数的,会出现异常的。
显示效果:
测试类:
复制代码
代码如下:
public class TestTime {
public
static void main(String[] args) {
TestTime tt = new
TestTime();
tt.showTimeCount(99*3600000+75*1000);
}
//时间计数器,最多只能到99小时,如需要更大小时数需要改改方法
public String
showTimeCount(long time) {
System.out.println("time="+time);
if(time =
360000000){
return "00:00:00";
}
String
timeCount = "";
long hourc = time/3600000;
String hour =
"0" + hourc;
System.out.println("hour="+hour);
hour =
hour.substring(hour.length()-2, hour.length());
System.out.println("hour2="+hour);
long minuec =
(time-hourc*3600000)/(60000);
String minue = "0" +
minuec;
System.out.println("minue="+minue);
minue =
minue.substring(minue.length()-2, minue.length());
System.out.println("minue2="+minue);
long secc =
(time-hourc*3600000-minuec*60000)/1000;
String sec = "0" +
secc;
System.out.println("sec="+sec);
sec =
sec.substring(sec.length()-2, sec.length());
System.out.println("sec2="+sec);
timeCount = hour + ":" + minue +
":" + sec;
System.out.println("timeCount="+timeCount);
return timeCount;
}
}
实际例子:
复制代码
代码如下:
//时间计数器,最多只能到99小时,如需要更大小时数需要改改方法
public String showTimeCount(long time) {
if(time =
360000000){
return "00:00:00";
}
String
timeCount = "";
long hourc = time/3600000;
String hour =
"0" + hourc;
hour = hour.substring(hour.length()-2,
hour.length());
long minuec =
(time-hourc*3600000)/(60000);
String minue = "0" +
minuec;
minue = minue.substring(minue.length()-2,
minue.length());
long secc =
(time-hourc*3600000-minuec*60000)/1000;
String sec = "0" +
secc;
sec = sec.substring(sec.length()-2, sec.length());
timeCount = hour + ":" + minue + ":" + sec;
return
timeCount;
}
private Handler stepTimeHandler;
private Runnable mTicker;
long startTime = 0;
//开始按钮
class startBtnListener implements OnClickListener {
@Override
public void onClick(View v) {
Button b =
(Button)v;
String buttonText =
b.getText().toString();
if("Start".equalsIgnoreCase(buttonText)){
b.setText("Stop");
// 清零 开始计时
stepTimeTV.setText("00:00:00");
stepTimeHandler = new
Handler();
startTime =
System.currentTimeMillis();
mTicker = new Runnable()
{
public void run() {
String
content = showTimeCount(System.currentTimeMillis() -
startTime);
stepTimeTV.setText(content);
long now =
SystemClock.uptimeMillis();
long next = now + (1000
- now % 1000);
stepTimeHandler.postAtTime(mTicker,
next);
}
};
//启动计时线程,定时更新
mTicker.run();
}else{
b.setText("Start");
//停止计时 Remove
any pending posts of Runnable r that are in the message
queue.
stepTimeHandler.removeCallbacks(mTicker);
}
}
}
用时间格式化的方式测试代码:
复制代码
代码如下:
//开始按钮 通过Calendar时间设置的方式,无法正常显示小时为0
class startBtnListener implements OnClickListener {
@Override
public void onClick(View v) {
Button b =
(Button)v;
String buttonText =
b.getText().toString();
if("Start".equalsIgnoreCase(buttonText)){
b.setText("Stop");
// 清零 开始计时
stepTimeTV.setText("00:00:00");
if (mCalendar == null)
{
mCalendar =
Calendar.getInstance();
TimeZone tz =
TimeZone.getTimeZone("GMT");//GMT+8
mCalendar.setTimeZone(tz);
mCalendar.get(Calendar.HOUR_OF_DAY);//24小时制
}
stepTimeHandler = new Handler();
//System.uptimeMillis()
//记录从机器启动后到现在的毫秒数,当系统进入深度睡眠时,此计时器将会停止
//System.currentTimeMillis()
//返回自1970年1月1日到现在的毫秒数,通常用来设置日期和时间
//System.elapsedRealtime()
//返回从机器启动后到现在的毫秒数,包括系统深度睡眠的时间,api里没有这个方法
//直接取得的是当地时区时间,当地时间跟时区有关,设置GMT后始终多12小时
startTime =
System.currentTimeMillis();//12*3600000 - 36*3600000减掉或者加上12小时都不行
mTicker = new Runnable() {
public
void run() {
//这个减出来的日期是1970年的 时间格式不能出现00:00:00
12:00:00
long showTime = System.currentTimeMillis()
- startTime;
Log.i(TAG,showTime+"");
mCalendar.setTimeInMillis(showTime + 13*3600000 +
1000);
String content = (String)
DateFormat.format(mFormat, mCalendar);
stepTimeTV.setText(content);
long now =
SystemClock.uptimeMillis();
long next = now + (1000
- now % 1000);
stepTimeHandler.postAtTime(mTicker,
next);
}
};
//启动计时线程,定时更新
mTicker.run();
}else{
b.setText("Start");
//停止计时 Remove
any pending posts of Runnable r that are in the message
queue.
stepTimeHandler.removeCallbacks(mTicker);
}
}
}
private Handler stepTimeHandler;
Calendar
mCalendar;
String mFormat = "yyyy-MM-dd hh:mm:ss";//yyyy-MM-dd
long startTime = 0;
private Runnable mTicker;
安卓实现同时多个倒计时效果的步骤:
我们首先需要在输入框中输入一个秒数,比如:12,然后获取输入框中的值,显示在一个TextView中;
点击“开始倒计时”按钮,每隔一秒钟,秒数减1,然后显示在TextView中;
点击“停止倒计时”按钮,计时器停止运行,当再次点击“开始倒计时”按钮,计时器继续运行。
平时用的每个商品都应该有两个属性值,这里叫它deadLine和isOverdue吧,表示商品的到期时间和是否到期,那么倒计时可以考虑这么实现:设置一个主计时器,每隔1秒发出消息告诉GridView现在的时间,GridView的Item获得这个时间之后就和deadLine比较,如果已经到deadline了,就把数据源中的这项标记成已到期(修改isOverdue的值为true);没到deadline,就计算还差多少时间,显示到GridView的Item里。