1

我有服务(服务有一个广播接收器,它监听ACTION_BATTERY_CHANGED),我想计算两个时间标记之间经过的时间,这就是我所拥有的:

public void onReceive(Context context, Intent intent){
                    int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                long time;
                long startTime=0;

                    if(OldLevel==0){
                    OldLevel=level;
                    startTime = System.nanoTime();

                    }
                    else{

                        time=System.nanoTime()-startTime;
                        startTime=System.nanoTime();  //edited


                    Log.e("inFFFF","FFFF "+time);// I somehow here get 16243428223995 nanoseconds which are too large because in reality it just take 1-2min.
                    }

                }

如果你能请: 1. 告诉我为什么时间比预期的大 2. 或者建议更好的方法来计算正在流逝的时间。

4

2 回答 2

3

在您的代码示例中,仅当满足条件 1 时才为 startTime 分配一个值。(否则您计算System.nanoTime()-startTimestartTime 为 0 的位置)

所以实际上你正在将现在时间与 0 进行比较,这是开始时间的初始值。这是错误的。纳米时间用于测量经过的时间。您应该始终将 System.nanoTime() 与 System.nanoTime() 的其他调用进行比较。见: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime()

也许尝试这样的事情:

public void onReceive(Context context, Intent intent){

                long time;
                long startTime= System.nanoTime();

                    if(....){

                    startTime = System.nanoTime();

                    }
                    else{

                        time=System.nanoTime()-startTime;



                    Log.e("inFFFF","FFFF "+time);// I somehow here get 16243428223995 nanoseconds which are too large because in reality it just take 1-2min.
                    }

                }
于 2013-03-10T13:08:56.870 回答
1

else开始时的时间总是为零。所以你需要从一开始就捕捉开始时间。

IE

long startTime=System.nanoTime();

否则保持其余代码不变

于 2013-03-10T13:26:57.067 回答