测量Android触摸事件时长:getEventTime()与currentTimeMillis()谁更高效?
两种触摸事件时间间隔测量方法的执行效率对比
结论很明确:第一种使用event.getEventTime()的方法,无论是执行效率还是测量准确性,都远优于第二种用System.currentTimeMillis()的方法。
为什么效率更高?
event.getEventTime()是直接读取MotionEvent对象内部已存储的时间戳,属于轻量的本地方法调用,几乎没有额外开销;System.currentTimeMillis()需要调用系统底层的时间服务,涉及用户态与内核态的切换,每次调用都有明显的额外开销,虽然单次差异不大,但高频触发时(比如连续触摸)差距会被放大。
额外优势:准确性更可靠
除了效率,第一种方法的测量结果也更准确:
event.getEventTime()记录的是触摸事件实际发生的时间——系统在硬件捕获到触摸动作时就会给事件打上这个时间戳,和onTouchEvent的调度延迟无关;System.currentTimeMillis()取的是代码执行到该行的时间,如果主线程因为其他任务(比如UI绘制、耗时操作)阻塞,onTouchEvent被延迟执行,这个时间会比实际触摸发生的时间晚,导致计算出的间隔出现偏差。
两种实现代码对比:
方法一(推荐)
public boolean onTouchEvent(MotionEvent event) { long msEventTime = event.getEventTime(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: msTouchDown = msEventTime; return true; case MotionEvent.ACTION_UP: msTouchUp = msEventTime; duration = msTouchUp - msTouchDown; return true; } return super.onTouchEvent(event); }
注:原代码未获取事件动作,此处修正为event.getAction()以保证代码可运行。
方法二
public boolean onTouchEvent(MotionEvent event) { long msEventTime = System.currentTimeMillis(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: msTouchDown = msEventTime; return true; case MotionEvent.ACTION_UP: msTouchUp = msEventTime; duration = msTouchUp - msTouchDown; return true; } return super.onTouchEvent(event); }
内容的提问来源于stack exchange,提问作者A.G.
相关产品推荐
相关产品推荐

