0

まず最初に、これが私のコードです:

public class MyClass extends Activity {

private Runnable updateTask = new Runnable() {  
    public void run() {
        now = SystemClock.uptimeMillis();
        elapsed = duration - (now - mStart); //duration = 30000
        if (elapsed > 0) {
            seconds = (int) (elapsed / 1000);
            minutes = seconds / 60;
            seconds     = seconds % 60;

            mHandler.postAtTime(this, now + 1000);
        }
        else {
            mHandler.removeCallbacks(this);
            finish();
        }
    }
};

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mStart = SystemClock.uptimeMillis();
    mHandler.post(updateTask);

    this.pause.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(MyClass.this,NextActivity.class);
            MyClass.this.startActivity(intent);
        }
    });
}

public void onStop(){
    super.onStop();
    mHandler.removeCallbacks(updateTask);
}

public void onRestart(){
    super.onRestart();
    mHandler.post(updateTask);
}

少し読みやすくするためにコードを短くしました。タイマーは正常に動作し、タイマーはゼロまでカウントダウンしています。私が抱えている問題は、一時停止ボタンを押したときにタイマーを「一時停止」しようとしていることです。一時停止ボタンは、実際には一時停止画面を表示する新しいアクティビティを開始し、現在のアクティビティを完全に妨げます。SystemClock の一時停止がないことがわかったので、onStop() でタイマー (mHandler.removeCallbacks(updateTask)) を実行しているスレッドを削除し、それを呼び出して onRestart で再開することをお勧めします。

問題は、onRestart() の場合、一時停止アクティビティ中にバックグラウンドで実行されているかのようにタイマーが表示されることです。25 秒で一時停止するとします。一時停止画面で 5 秒間表示され、メイン アクティビティに戻ると、タイマーが本来の 25 秒ではなく 20 秒を表示するようになりました。一時停止画面にいるにもかかわらず、SystemClock がまだ実行されていることを理解しています。SystemClock の値を操作して、中断した時刻を取得する方法についての手がかりがありません。

ここ StackOverflow の誰かからタイマー コードを借りましたが、「mStart」と「now」が何をすべきかわかりません。私はこれに約3時間取り組んでいますが、まだこれを理解できません。

4

1 に答える 1

1

私が抱えている問題は、一時停止ボタンを押したときにタイマーを「一時停止」しようとしていることです。

タイマーを一時停止する直接的な方法はありませんが、タイマーをキャンセルして変更mStartして、目的を達成することができます。

this.pause.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        mHandler.removeCallbacks(updateTask);
        // Start your pause screen
    }
});

次に、タイマーの更新を再開したいが、mStart計算を調整して経過時間を削除する場合。

protect void onResume() {
    super.onResume();

    // Move these here from onCreate()
    mStart = SystemClock.uptimeMillis() - elapsed;
    mHandler.post(updateTask);
}

追加
これは私を悩ませます、おそらく私は疲れているからです:

elapsed = duration - (now - mStart);
if (elapsed > 0) {

私にとってそれはより直感的ではないからです

elapsed = now - mStart;
if (elapsed < duration) {

しかし、それは私がうるさいだけです。あなたにとって最も理にかなったアプローチを使用してください。

使用する場合:

elapsed = duration - (now - mStart);

次に、適切な方程式(以下で指摘したように)は次のとおりです。

mStart = SystemClock.uptimeMillis() + elapsed - duration

「mStart」と「now」が何をすべきかわかりません。

これら 2 つの変数は、タイマーの実行時間を計算するために使用されます。

  • now今でしょ。
  • mStartタイマーが開始された時刻です。
  • now - mStartタイマーが実行されている時間です。
于 2013-03-06T23:10:59.443 に答える