2013-03-10 2 views
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. Или предложите лучший способ рассчитать время, прошедшее.

+0

Есть ли причина, почему вы не используете 'System.currentMillis()'? Конечно, это менее точно, но может быть, эта альтернатива достаточно хороша, не так ли? – Trinimon

+0

Я использовал миллисы раньше, неточно результат:/ – whiteLT

+0

@whiteLT, если первое условие истинно, чем оно никогда не перейдет к другому, поэтому в то время одно условие будет удовлетворять, поэтому вы получите фактическое время, но не истекшее time – Pragnani

ответ

3

В вашем примере кода вы назначаете startTime со значением, только если выполнено условие 1. (иначе вы вычислите System.nanoTime()-startTime, где startTime 0)

Таким образом, вы сравниваете теперь время до 0, которое является начальным значением времени начала. это неправильно. nano time используется для измерения прошедшего времени. , вы всегда должны сравнивать 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. 
        } 

       } 
+0

Я отредактировал свой пример, чтобы показать, что я уже принял меры предосторожности для этого. – whiteLT

+0

Что вы в первый раз получаете по этому коду? startTime все равно 0 здесь ... –

+0

Впервые эта служба запущена, она только делает отметку времени. Я отредактировал еще раз, чтобы вы лучше поняли, что я хочу сделать – whiteLT

1

В момент else времени начала всегда равен нулю. поэтому вам нужно сначала записать время начала в начале.

т.е.

long startTime=System.nanoTime(); 

иначе сохранить оставшийся код, как это

+0

. Как начать время всегда быть нулевым, если я заявляю об этом и даже принимаю меры предосторожности, если первое условие не выполняется? – whiteLT

+0

Из-за этого long startTime = 0; – Pragnani

+0

Если он переходит в условие else, каково значение времени начала, оно не обновляется. – Pragnani

Смежные вопросы