Android Handler中计时延迟的补偿方法
来源:互联网 发布:待机时间长的平板知乎 编辑:程序博客网 时间:2024/06/05 19:01
--- by Zhongxiang.Huang
近段时间,在开发项目过程中遇到一个双重计时不准确的问题,该项目功能是计算手机屏幕产生蓝光的能量值;原理大概是这样:设置好屏幕亮度,纯色屏,计算屏幕在20s时间内发出的蓝光能量值,然后在这20s内,还要分开100次(这里以100次举例)来分别计算,最后算总和,计算方法这里就不阐述了,因此就涉及了双重的计时需求,一个是20s单次计时,一个是20s内100次小计时,每个小计时时间是0.2s,需每隔0.2s得计算一次蓝光能量值。
开发过程中,我使用的计时方式是主线程中使用Handler,这种方式最简单,在主线程中通过handler.postDealyed(……, 200),并在onHandleMessage中继续post消息,这样就实现了每隔200ms进行一次消息循环。大家知道,这种方式下,如果使用handler.postDealyed(……, 200)方式来进行计时,是不准确的,有误差,误差的原因在于在你收到消息,到你重新发出handler.postDealyed的时间,并不是瞬间完成的,这里面有很多逻辑处理的时间,况且handler本身也是耗损性能的,所以消息并不可能按照理想的200ms延迟来进行发送,这就导致了误差的累积。而项目中对于这样的时间精确度是不能接受的,因为这样就不能达到预期的设计效果,因误差的影响,计时的超时,可能就做不到预设定的每隔0.2s计算一次,有时可能隔了0.3s、0.4s,从而就做不到在20s内计算100次的目的,常常发现预计100次只有98次或95次被完成。
所以,我们每次在post的时候,都需要对计时进行补偿,怎么做呢? 我们知道,Android中有很多计时的控件,我们这里对TextClock查看其源码,研究其是如何处理这个问题的,于是找到了这段代码:
private final Runnable mTicker = new Runnable() {
public void run() {
onTimeChanged();
long now = SystemClock.uptimeMillis();
long next = now + (1000 - now % 1000);
getHandler().postAtTime(mTicker, next);
}
};
我先前是通过postDelay来触发消息事件的,但这里系统使用了postAtTime,这是为什么呢?再看前面两行代码,代个值进去试下,假如now取出来是1200,那么next = 1200 + (1000 - 1200 % 1000)也就是next= 2000。虽然我们前一次本该在1000触发的事件,被各种逻辑延迟到1200,如果用postDelay,延迟被累积了,但如果用这种方式,误差就会被补偿,因此问题也就解决了。
- Android Handler中计时延迟的补偿方法
- Android中计时的两种方法
- Trick:网络游戏中角色行走延迟的补偿
- android中Handler简介&利用Handler实现计时功能
- android中Handler简介&利用Handler实现计时功能
- Android handler计时调用
- 使用android中的handler延迟执行方法
- handler的使用---如何实现Android计时与倒计时的几种方法
- Android中延迟加载方法的使用
- Android中TimerTask与Handler延迟多线程源代码
- C++中精确计时的方法
- C语言中计时的方法
- C语言中常用的计时方法
- Android中延迟执行方法的几种方式
- matlab 中使用fir滤波器后相位延迟如何补偿
- android 计时(可用于会议计时) handler
- android开发 handler的延迟发送,与回收
- android开发 handler的延迟发送,与回收
- Android 异步消息处理
- linux下mysql ERROR 2002 (HY000)错误解决方法
- 关于加密和加签的说明
- Type erroe in tensorflow
- 171031_扭矩和功率的计算公式推导及记忆方法
- Android Handler中计时延迟的补偿方法
- weekly contest 56 第一题 1-bit and 2-bit Characters
- 如何快速验证你的创业想法是否可行?这里有7大策略
- html显示隐藏表格内外边框
- Maven(一)
- Ubuntu已经达到 MaxReports 限制,没有写入 apport 报告
- 英语之连词规则
- 20171030
- 前端性能优化