0

私はたくさんの活動を結びつけ、次から次へとつなげています。ある活動中に、経過時間を測定したいと考えています。私が理解しているように、私はSystem.nanoTime()開始時間を見つけるために使用し、ユーザーはいくつかのことを行い、それをもう一度使用して終了時間を見つけ、2つを差し引くと、アクティビティに費やされた経過時間がわかります。しかし、アクティビティの実行中に何かが発生したとします。開始時刻は既に作成されていますが、ユーザーが電話などを受けると、アクティビティはバックグラウンドに置かれます。通話が終了し、ユーザーはアクティビティに戻ります。アプリがバックグラウンドにあるときでも、タイマーは常に実行されていましたか? アプリを離れて戻ってきたので、タイマーは「リセット」されていますか?

また、私が開始System.nanoTime()すると、その特定のアクティビティまたはメインアクティビティの開始からの時間が返されますか?

編集:特定の時点で最初の目盛りを設定すると、アプリはバックグラウンドに入り、フォアグラウンドに戻り、2 つ目の目盛りを設定するとします。理想的には、バックグラウンドで費やされた時間とともに経過時間が必要です。System.nanoTime()これを達成しますか?

4

3 に答える 3

2

static long nanoTime():

ローカル システムで利用可能な最も正確なタイマーの現在のタイムスタンプを返します。

経過時間を表すために「タイマー」(つまり、あらゆる種類のステートフル オブジェクト) を使用していません。あなたが指摘したように、将来のある時点で System.nanoTime() を再度呼び出し、減算して経過時間を見つけます。

質問の例のように、このアクティビティ以外で費やされた時間を除外したい場合は、計算を管理するためにonPause()とを使用する必要があります。onResume()または、ある種のタイマー オブジェクトに切り替える場合は、これらのメソッドを使用してタイマーを一時停止および再開します。

最も理にかなっていると思われる場所ならどこでも「タイマー」を「開始」できます。ユーザーが何らかのアクション (ボタンを押すなど) を開始したときの場合は、OnClickListener でそれを指定します。メソッド/コードパスの実行時間を測定するだけの場合は、その最初に実行してください。

于 2013-07-08T16:27:44.207 に答える
1

ドキュメントによると

System.nanoTime()最も正確な利用可能なシステム タイマーの現在の値をナノ秒単位で返します。

なのでタイマーではありません。システム時刻をナノ秒単位で返すだけです。活動とは関係ありません。

アクティビティの有効期間を測定する場合は、onCreate と onDestroy で時間を取得します。また、アクティビティがフォアグラウンドにあった時間を知りたい場合は、onResume と onPause で時間を取得します。

于 2013-07-08T16:27:18.813 に答える