1

私はサービスを持っています(サービスには をリッスンするブロードキャストレシーバーがありますACTION_BATTERY_CHANGED)、2つのタイムマーク間の経過時間を計算したいのですが、これは私が持っているものです:

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()-startTime(それ以外の場合は、startTimeが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は常にゼロです。そのため、最初に開始時間をキャプチャする必要があります。

すなわち

long startTime=System.nanoTime();

それ以外の場合は、残りのコードをそのままにしておきます

于 2013-03-10T13:26:57.067 に答える