Android 倒计时(有效解决计时不准的问题)

Android--简易倒计时 阅读详情

先看效果图

1,我采用的Handler延时  mHandler.sendEmptyMessageDelayed(1, 1000); 1000毫秒一次;

开始的时候  我想到的时  我要在20秒 开始倒计时  然后1000一次减1   如果倒计时的多了的话,  那就会不准。不是实际的20秒

    1,后来,我想,当前时间是时刻变化的 也是准确的, 然后我给定他在未来的某个时刻。 每次Textview显示的时候都显示他们的差值,即使手机卡的用户 也不会因为卡而显示不正确。这对于某些抢购来说,时间显示很重要。

    2, 也有的他也不确定未来的某个时刻。 就比如定时炸弹, 你在触发开关后的5分钟爆炸。  你就在触发开关那一刻 获取他的当前时间 然后加上5分钟。    然后去和每次的当前时间相减。

</pre><pre name="code" class="java"> //这个是 字符串转毫秒值的方法
public long time2millionSeconds(String str) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");   //  <span style="color:#ff0000;">HH  要大写(24小时制的)  如果是小写的就是12小时制
</span>
		long millionSeconds = sdf.parse(str).getTime();// 毫秒

		return millionSeconds;

	}


2, 还是把整个demo代码贴出来

public class MainActivity extends Activity {

	private List<Timebean> list;
	private Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			adpater.notifyDataSetChanged();
			mHandler.sendEmptyMessageDelayed(1, 10);
		};
	};
	private MyAdpater adpater;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		list = new ArrayList<Timebean>();

		list.add(new Timebean("20151020151701")); // 这是2015年10月20日15时 17分 01秒
		list.add(new Timebean("20151020151800"));
		list.add(new Timebean("20151020151900"));
		list.add(new Timebean("20151021120300"));
		list.add(new Timebean("20151021120400"));
		list.add(new Timebean("20151021120500"));
		list.add(new Timebean("20151021120600"));
		list.add(new Timebean("20151021120700"));

		GridView gv = (GridView) findViewById(R.id.gridview);
		adpater = new MyAdpater();
		gv.setAdapter(adpater);
		mHandler.sendEmptyMessageDelayed(1, 1);

	}

	class MyAdpater extends BaseAdapter {

		public int getCount() {
			// TODO Auto-generated method stub
			return list.size();
		}

		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null) {
				convertView = LayoutInflater.from(parent.getContext()).inflate(
						R.layout.ddddddd, null);
			}

			TextView tv = (TextView) convertView.findViewById(R.id.tv);
			Timebean time = list.get(position);
			Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
			long cur = curDate.getTime();
			long t;
			try {
				t = time2millionSeconds(time.a);

				String ts = time2time(t - cur);
				
				
				tv.setText(ts);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			return convertView;
		}

	}

	public String time2time(long t) {
		if (t<= 0) {
			return  "00时:00分:00秒:000";
		}
		
		long haomiao = t % 1000;   
		

		long miao = t / 1000 % 60;
		long min = t / 1000 / 60 % 60;
		long h = t / 1000 / 60 / 60;

		return h + "时:" + min + "分:" + String.format("%02d", miao) + "秒:"
				+ String.format("%03d", haomiao);
		      

	}

	@SuppressLint("SimpleDateFormat")
	public long time2millionSeconds(String str) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

		long millionSeconds = sdf.parse(str).getTime();// 毫秒

		return millionSeconds;

	}

}


    3,bean 类

public class Timebean {
  String a ;

public Timebean(String a) {
	super();
	this.a = a;
}
  
}

demo 下载地址 :  http://download.youkuaiyun.com/detail/androidforme/9196905

后续补充:获取系统时间似乎是获取手机设置的时间。 而每个人的手机设置的时候不一样。所以,我想到的方案,是请求接口的时候,由服务器统一给出当前北京时间。

然而有不能每一秒都问服务器请求当前时间。 这样就要用的相对时间来处理。

服务器给的统一的北京时间 - 手机本机当前时间 = 相对时间 ;

手机本机当前时间 + 相对时间 = 北京时间。 

这样有个相对时间 ,每次获取手机系统时间就能算出全国统一的时间。


2,后来发现在ListView  中, 时刻在刷新, 里面的控件 比如button 这样的,点击会出问题。  所以我们要只有这个显示时间的View 单独刷新。 这样就只能自定义View了。如何确保时间 还是采用之前的思路。

自定义View

public class TimeView extends View {
	Paint mPaint; // 画笔,包含了画几何图形、文本等的样式和颜色信息
	
	long a;
	long sub;
	private Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
		
			
			invalidate();
		};

	};

	public TimeView(Context context) {
		super(context);
		init();
	}

	public TimeView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public TimeView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		init();
	}

	private void init() {
		mPaint = new Paint();
		mPaint.setColor(Color.RED); // 这里设置 画笔颜色
		mPaint.setTextSize(24); // 字体大小
		mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
		mPaint.setTextAlign(Align.CENTER);

	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
		long cur = curDate.getTime();// 获取当前时间
		
		
		canvas.drawText(time2time(a - (cur+sub)) , 50, 50, mPaint);// 用画笔在画布上添加文字,中间两个参数对应的是坐标。
		mHandler.sendEmptyMessageDelayed(1, 100);
	}

	/**
	 * 剩余毫秒值 转换成 剩余时间格式
	 * 
	 * @param t
	 * @return
	 */
	public String time2time(long t) {
		if (t <= 0) {
			return "00时:00分:00秒:000";
		}

		long haomiao = t % 1000;

		long miao = t / 1000 % 60;
		long min = t / 1000 / 60 % 60;
		long h = t / 1000 / 60 / 60;

		return h + "时:" + min + "分:" + String.format("%02d", miao) + "秒:"
				+ String.format("%03d", haomiao);

	}

	/**
	 * yyyyMMddHHmmss 时间格式转毫秒值
	 * 
	 * @param str
	 * @return
	 * @throws ParseException
	 */
	@SuppressLint("SimpleDateFormat")
	public long time2millionSeconds(String str) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		long millionSeconds = sdf.parse(str).getTime();// 毫秒

		return millionSeconds;

	}

	/**
	 * 
	 * @param s  截止时间
	 * @param cur 服务器本地时间
	 * @throws ParseException
	 */
	public void setData(String s , String  cur) throws ParseException {
		a = time2millionSeconds(s); 
		
		Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
		long cur1 = curDate.getTime();// 获取当前时间
		sub = time2millionSeconds(cur) -cur1; 
		
	}

在XML 使用。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

   

    <com.example.dadad.TimeView
        android:id="@+id/s"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


 调用

TimeView  v = (TimeView) findViewById(R.id.s);
	
	try {
		v.setData("2015-10-27 18:23:01" ,"2015-10-27 18:21:01" );
	} catch (ParseException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

效果图








Vue 移动端活动倒计时优化 前言 通常写倒计时效果,用的是 setInterval,但这会引发一些问题,最常见的问题就是定时器不准。 如果只是普通的动画效果,倒也无所谓,但倒计时这种需要精确到毫秒级别的,就不行了,否则活动都结束了,用户的界面上倒计时还在走,但是又参加不了活动,会被投诉的╮(╯▽╰)╭ 一、 知识铺垫 1. setInterval 定时器 先说本文的主角 setInterval,MDN web doc 对其... 阅读详情

相关推荐

Android解决AlarmManager计时不准和手机灭屏后延迟的问题

然而,有时候我们可能会遇到一些问题,比如AlarmManager的计时不准确或在手机灭屏后出现延迟的情况。本文将介绍如何解决这些问题,并提供相应的源代码示例。这样,我们的定时任务就能在预定的时间准确触发,无论手机是否处于灭屏状态。在上面的示例代码中,我们使用了setExact()方法来确保定时任务准确执行,并使用ELAPSED_REALTIME_WAKEUP标志来确保任务在灭屏时也能被唤醒。在上面的示例代码中,我们添加了WAKE_LOCK权限以获取唤醒锁,并声明了我们的AlarmReceiver接收器。

JaDentenet的博客 1365

问题记录 Android Handler —— 使用sendEmptyMessageDelayed计时会产生误差

假设now= 0,使用delay延迟1000ms时,因为各种损耗,假设1300毫米后才能处理这条消息,那么第一次收到消息时,时间为now = 1300,现在next = 1300 + (1000 - 1300 % 1000) = 2000,那我指定时间为2000时发这条消息,比原本提前了300ms发送补偿这个误差(原本每次延迟1000ms发送,现在相当于 (2000-1300)700ms后就发送这条消息)使用sendEmptyMessageAtTime,在指定的时间点发出这条消息。

weixin_54087854的博客 956

【汽车ECU标定技术解析】DCM文件与A2L、HEX的协同工作机制

本文深入解析了汽车ECU标定中DCM、A2L与HEX三大核心文件的协同工作机制。A2L文件作为定义标定变量地址与规则的“图纸”,DCM文件承载工程师调试后的具体标定数据,最终通过A2L的地址映射,将DCM数据固化生成可刷入ECU的HEX文件,形成完整的标定数据流转闭环。

weixin_29214559的博客 436

android休眠之后 定时任务TimerTask不生效

本人也是安卓菜鸟一枚,入行不久,公司需要实现一个功能: 就是没有连接电源,黑屏(休眠)之后倒计时20分钟之后让机器关机。当时我就觉得也不是很难,我再Luancher中 可以注册动态广播监测到黑屏的操作,然后加入一个判断标志看是否连接了电源,然后执行倒计时任务就ok了。谁知道休眠之后,居然计时任务不生效了。我弄了很久才发现。后来就百度啊,然后找到了wakeLock,把延迟任务放入wakeLock中

u011183484的专栏 9788

(赛事-2022)[re:Invent 2018]-002:通过分析log多次迭代优化奖励函数后- 最快7.6s / 圈

Deepracer training 流程

Rainbow 4711

项目过程记录:ADS-B信号接收并显示(Ubuntu20.04+ANTSDR E310V2)

最近被安排做一个ADS-B信号接收的项目,拿到软件无线电模块(ANTSDR E310V2)后安装环境和软件真的太折磨了。。在此记录以下我走过的弯路,大家可以参考一下。

weixin_43627638的博客 5017

Android学习自记 之 Handler

Handler、Looper、MessageQueue 和 Thread 这三个class紧密相关的:默认情况下,一个新创建的Thread对象是没有循环消息队列可用的,当在该线程中创建了Looper对象(可直接调用静态方法 Looper.prepare() 来实现创建)后,该Lo

晓风翌日 314

用野火FPGA开发板(EP4CE10)手把手教你实现一个高精度频率计(附完整Verilog代码)

本文详细介绍了基于野火FPGA开发板(EP4CE10)实现高精度频率计的全过程,涵盖等精度测量法的核心原理、Verilog代码实现及优化技巧。通过实际案例演示,帮助开发者掌握1Hz-50MHz范围、精度达0.1%的频率计设计方法,并提供完整的工程代码和实测数据。

weixin_29261711的博客 439

Handler延迟消息执行机制堵塞实现机制

Handler延迟消息执行机制,会阻塞吗? 注:本篇文章为个人记录使用,只为后期方便知识点快速查阅到,如有不对请及时告知更正 面试经常被问到到问题 sendMessageDelayed是如何实现延时发送消息的? sendMessageDelayed是通过阻塞来达到了延时发送消息的结果,那么会不会阻塞新添加的Message? sendMessageDelayed方法原理 sendMessageD...

qq_33490704的博客 2345

FPGA驱动OV5640:从SCCB协议到图像数据采集的实战解析

本文详细解析了使用FPGA驱动OV5640摄像头模组的完整流程,从SCCB协议通信、寄存器配置到图像数据采集。重点阐述了SCCB(与I2C类似)协议的实现细节、关键的上电复位时序,以及如何通过状态机解析视频流时序并捕获图像数据,为嵌入式视觉开发提供了实战指南。

weixin_29191761的博客 187

避坑指南:Vue2中使用TinyMCE5常见问题解决方案(含PowerPaste插件异常处理)

本文针对Vue2项目中集成TinyMCE 5富文本编辑器时遇到的高频疑难问题,提供了一套深度实战解决方案。内容涵盖环境搭建、资源路径配置、图片与视频上传处理、以及替代PowerPaste插件的自定义粘贴清理方案,旨在帮助开发者有效规避常见陷阱,构建稳定可靠的内容编辑功能。

weixin_29012677的博客 154

Android 倒计时出现误差解决方式

写在前面 这几天在实现一共和倒计时有关的功能,使用CountDownTimer实现。然而,在测试的时候发现,倒计时经常发现跳秒、不出现1的情况,因此对这方面进行了一些了解。本文准备介绍一下CountDownTimer倒计时不准确的原因,以及自己实现的一个计时器~ CountDownTimer的问题 发现跳秒、不出现1的问题之后,首先将每次onTick()的回调时间打印了出来(这里忘记保存log了...

Dengzm94 2070

PyTorch实战(13)——图卷积网络(Graph Convolutional Network,GCN)

图卷积网络 (Graph Convolutional Network, GCN) 模型能够同时结合节点级特征和图级(邻域)信息进行分类,显著提升了图数据建模能力,适用于节点分类、图分类等多种任务。本节中,我们通过 PyTorch Geometric 库在 CiteSeer 图数据集上构建模型,们首先用前馈神经网络作为基线模型完成节点分类任务,随后用 GCN 模型替代前馈网络显著提升了分类准确率。

盼小辉丶的博客 3249

Android 日期倒计时

实现抢票或者秒杀之类的倒计时效果,可更改倒计时格式,需求:1天5小时8分钟22秒这种 本文章借鉴于Android定时器…做天数时间倒计时 效果图 取一个指定时间 比如抢票(开抢)时间为2020-6-9 12:00:00 获取当前时间(网络时间) /** * * @return * 这个方法获取的结果是24小时制的,月份也正确。 * 这个方法不随手机时间的变动而变动。 * 也就是说,即使手机设置成别的时区,不是东八区,这个方法返回的也照样是北京时间!!!

weixin_43807869的博客 1284

高通平台 Android T 蓝牙技术全解析:A2DP 与 AVRCP 核心代码路径与交互流程

A2DP 接收端 - 连接流程(AVDTP 打开)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 288

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android listview item倒计时功能

前段时间项目有个需求是需要在listview的item中做个60s倒计时功能,并且倒计时的时间由本地记录,无关服务端。网上找了一些demo,有倒计时的功能,但总有些问题,也无法满足需求,最后自己改进后满足了需求,然后就想着记录下开发过程中遇到的一些问题以及最后的成品。 项目需求背景:app是关于视频会议,视频会议列表由listview来展示。本次需求是需要在会议列表的item中加一个再次通知的功能...

senger_z的博客 1256

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android 倒计时功能,完美解决系统时间更改后,倒计时不准问题。

Android 倒计时功能,完美解决系统时间更改后,倒计时不准问题。 1、Android倒计时大家一下子就会想到使用:timer.schedule(); 我们查看schedule实现的源码:sched(task, System.currentTimeMillis()+delay, 0); System.currentTimeMillis()这个玩意就是使用系统时间来做的,假如我们更改了系统时...

Jocerly的专栏 4356

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android将倒计时做到极致

倒计时的实现有很多方式,我觉得分享这个技术的关键在于有些官方的,甚至第三方的,也许能帮我实现99%的效果,但是当你从99%优化到100%,哪怕这1%微不足道,但你能从这个过程中得到的东西远远比你想象中的要多。

Eqiqi的博客 627

android 定时器 误差,Android 倒计时出现误差解决方式

写在前面这几天在实现一共和倒计时有关的功能,使用CountDownTimer实现。然而,在测试的时候发现,倒计时经常发现跳秒、不出现1的情况,因此对这方面进行了一些了解。本文准备介绍一下CountDownTimer倒计时不准确的原因,以及自己实现的一个计时器~CountDownTimer的问题发现跳秒、不出现1的问题之后,首先将每次onTick()的回调时间打印了出来(这里忘记保存log了,就口述...

weixin_28224217的博客 970

android倒计时代码 精确度,Android 关于 CountDownTimer onTick() 倒计时不准确问题源码分析...

第一次写源码分析类博客,如有错误,欢迎讨论和指正~~ (^_^)--------------------------------------最近在写一个倒计时控件CountdownView, 发现系统自带的CountDownTimeronTick() 并不准确,当然,它的倒计时长度还是比较准确的。本博客demo见:countdown一、问题CountDownTimer 使用比较简单,...

weixin_33132819的博客 1532

安卓java 倒计时_用RxJava实现倒计时与踩坑

废话不多说直接上代码:public class RxCountDown {public static Observable countdown(int time) {if (time < 0) time = 0;final int countTime = time;return Observable.interval(0, 1, TimeUnit.SECONDS).subscribeOn(A...

weixin_30974667的博客 364

Android倒计时神器 - CountDownTimer

Android倒计时神器 - CountDownTimer 啥是CountDownTimer? ​ CountDownTimer是Andorid.os包下一个谷歌为我们封装好的一个倒计时工具。我们吗、平时开发过程中像一些验证码、倒计时的功能,如果自己封装一个倒计时工具就会稍显麻烦。而谷歌这个工具使用起来非常方便。 源码 package android.os; public abstract cl...

程序猿—从入门到上道 409

直播商城开发 Android 倒计时出现误差解决方式

CountDownTimer的问题 发现跳秒、不出现1的问题之后,首先将每次onTick()的回调时间打印了出来(这里忘记保存log了,就口述一下)。在网上搜到的大家遇到的问题,大多数是因为,间隔时间设置为1000ms,但是回调的时候每次都要多出几毫秒或十几毫秒,而我的设备在实际测试中,多了40ms,即每倒计时25s,就会跳过一秒的显示。 首先我们要看一下CountDownTimer的源码,代码很简单,网上的分析也一抓一大把,这里就不多说了。贴出关键部分: synchronized (CountDownTi

云豹网络科技 594

android倒计时函数,Android倒计时神器(CountDownTimer)

Android倒计时神器 - CountDownTimer,供大家参考,具体内容如下啥是CountDownTimer?​CountDownTimer是Andorid.os包下一个谷歌为我们封装好的一个倒计时工具。我们吗、平时开发过程中像一些验证码、倒计时的功能,如果自己封装一个倒计时工具就会稍显麻烦。而谷歌这个工具使用起来非常方便。源码package android.os;public abstr...

weixin_30952479的博客 485

android的CountDownTimer开始时间不准或者不能倒计时到0的一种解决思路

我们需要用到android的CountDownTimer开始时间不准或者不能倒计时到0的一种解决思路

菜鸟江涛的博客 1万+

获取日期的时间戳问题、前端倒计时不准问题

获取日期的时间戳问题、前端倒计时不准问题 1、获取日期的时间戳问题:new Date(date).getTime(),用该方法来获取时间戳,在ios中返回NaN,安卓机正常 原因:date = ’2020-09-09 12:00‘,在ios中,时间不能用‘-’分割,应该用/,即应该用“2020/09/09 12:00”,否则会报下 面的错误:Cannot assign to read only property 'exports' of object '#<Object>' 因此在调用new

感恩、奋进、自信 2156
上一篇: java.util.ConcurrentModificationException异常。
下一篇: Android 联系人A-Z列表布局实现分析。
androidforme
博客等级 码龄11年 3粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值