SystemcurrentTimeMillis
我们经常用这个接口来统计时间,比如
final long startTime = System.currentTimeMillis();
...
final long endTime = System.currentTimeMillis();
duration = endTime - startTime;
这端代码正常情况下是没有什么问题的,但是如果是在线上,用户量极大,且startTime和startTime的调用点不在一个地方,或者这个duration比较长时间,比如统计用户停留耗时,这个代码可能会收集到垃圾数据。因为currentTimeMillis本质上和日历时间一样,用户是可以修改的,比如在startTime和endTime中间用户将日历时间调回去了,那么得到的duration是负值。当然对于后台来说,可以过滤这些垃圾数据。但是为了更好的统计时间推荐使用elapsedRealtime。
elapsedRealtime
返回的是系统从启动到当前时间,所以这个时间做耗时duration统计是比较准确的,且不受用户调整日期行为影响。
timer问题
我们有时通过timer来执行一些定时任务
TimerTask timerTask = new TimerTask(){
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("