2012-11-26 29 views
0

我有一個秒錶,它正常工作,但是當我按下主頁按鈕或按鈕關閉鍾並在一段時間後重新打開它時,我在秒錶中看到錯誤的時間。請告訴我,我能做些什麼來解決這個問題?秒錶不能在後臺模式下工作

public class Stopwatch extends Activity { 
    Timer mTimer; 
    int second_f_p = 0, second_s_p = 0, millisecond = 0; 
    int minute_f_p = 0, minute_s_p; 
    int hour_f_p = 0, hour_s_p = 0; 
    int numberOfLap = 0; 
    TextView tv; 
    TextView TVlap; 
    Button btn_start; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_stopwatch); 

     btn_start = (Button) this.findViewById(R.id.button1); 
     tv = (TextView) this.findViewById(R.id.tvTime); 
     btn_start.setOnClickListener(new View.OnClickListener() {@Override 
      public void onClick(View arg0) { 
       btn_start.setClickable(false); 
       mTimer = new Timer(); 
       mTimer.schedule(new TimerTask() { 

        @Override 
        public void run() { 
         timerMethod(); 
        } 

       }, 0, 100); 

      } 
     }); 

     Button btn_stop = (Button) this.findViewById(R.id.button2); 
     btn_stop.setOnClickListener(new View.OnClickListener() {@Override 
      public void onClick(View v) { 
       btn_start.setClickable(true); 
       mTimer.cancel(); 
      } 

     }); 

     Button btn_reset = (Button) this.findViewById(R.id.button4); 
     btn_reset.setOnClickListener(new View.OnClickListener() {@Override 
      public void onClick(View v) { 

       second_f_p = 0; 
       second_s_p = 0; 
       minute_f_p = 0; 
       minute_s_p = 0; 
       millisecond = 0; 
       hour_f_p = 0; 
       hour_s_p = 0; 
       numberOfLap = 0; 
       TVlap.setText(""); 
       tv.setText(String.valueOf(hour_f_p) + String.valueOf(hour_s_p) + ":" + String.valueOf(minute_f_p) + String.valueOf(minute_s_p) + ":" + String.valueOf(second_f_p) + String.valueOf(second_s_p) + "." + String.valueOf(millisecond)); 
      } 

     }); 
     TVlap = (TextView) this.findViewById(R.id.tvLap); 
     Button btn_lap = (Button) this.findViewById(R.id.button3); 
     btn_lap.setOnClickListener(new View.OnClickListener() {@Override 
      public void onClick(View v) { 
       numberOfLap++; 
       TVlap.setText(TVlap.getText() + String.valueOf(numberOfLap) + ". " + String.valueOf(hour_f_p) + String.valueOf(hour_s_p) + ":" + String.valueOf(minute_f_p) + String.valueOf(minute_s_p) + ":" + String.valueOf(second_f_p) + String.valueOf(second_s_p) + "." + String.valueOf(millisecond) + "\n"); 
      } 

     }); 

    } 

    private void timerMethod() { 
     this.runOnUiThread(doSomething); 
    } 

    private final Runnable doSomething = new Runnable() {@Override 
     public void run() { 
      millisecond++; 

      if (millisecond == 10) { 
       second_s_p++; 
       millisecond = 0; 

      } 

      if (second_s_p == 10) { 
       second_f_p++; 
       second_s_p = 0; 
      } 
      if (second_f_p == 6) { 
       minute_s_p++; 
       second_f_p = 0; 
      } 
      if (minute_s_p == 10) { 
       minute_f_p++; 
       minute_s_p = 0; 
      } 
      if (minute_f_p == 6) { 
       hour_s_p++; 
       minute_f_p = 0; 
      } 

      if (hour_s_p == 10) { 
       hour_f_p++; 
       hour_s_p = 0; 
      } 

      if (hour_f_p == 9 && hour_s_p == 9) { 
       second_f_p = 0; 
       second_s_p = 0; 
       minute_f_p = 0; 
       minute_s_p = 0; 
       hour_f_p = 0; 
       hour_s_p = 0; 
      } 
      tv.setText(String.valueOf(hour_f_p) + String.valueOf(hour_s_p) + ":" + String.valueOf(minute_f_p) + String.valueOf(minute_s_p) + ":" + String.valueOf(second_f_p) + String.valueOf(second_s_p) + "." + String.valueOf(millisecond)); 
     } 

    }; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_stopwatch, menu); 
     return true; 
    } 

} 
+0

我認爲你必須添加代碼才能讓我們任何人檢查你錯過了什麼? – Rob

+0

我認爲這可能與Activity的生命週期有關。您可能想要實施一項服務,以使其長期生活。無論如何,你提供的信息太少,不足以使你的問題有用。 – tanyehzheng

+0

我剛剛加了代碼 –

回答

0

看到下面的代碼鏈接

http://www.edumobile.org/android/android-development/stop-watch-example/ 

F你看看天文臺類的源代碼,你會看到,它不經過時間存儲在一個領域,它在內部計算它每次需要更新顯示。

但是它是比較容易做同樣在自己的代碼:

long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase(); 

這假定您已經啓動您的時鐘是這樣的:

chronometerInstance.setBase(SystemClock.elapsedRealtime()); 
chronometerInstance.start(); 

這裏有一個完整的例子:

public class ChronoExample extends Activity { 
Chronometer mChronometer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    LinearLayout layout = new LinearLayout(this); 
    layout.setOrientation(LinearLayout.VERTICAL); 

    mChronometer = new Chronometer(this); 
    layout.addView(mChronometer); 

    Button startButton = new Button(this); 
    startButton.setText("Start"); 
    startButton.setOnClickListener(mStartListener); 
    layout.addView(startButton); 

    Button stopButton = new Button(this); 
    stopButton.setText("Stop"); 
    stopButton.setOnClickListener(mStopListener); 
    layout.addView(stopButton); 

    Button resetButton = new Button(this); 
    resetButton.setText("Reset"); 
    resetButton.setOnClickListener(mResetListener); 
    layout.addView(resetButton);   

    setContentView(layout); 
} 

private void showElapsedTime() { 
    long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();    
    Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis, 
      Toast.LENGTH_SHORT).show(); 
} 

View.OnClickListener mStartListener = new OnClickListener() { 
    public void onClick(View v) { 
     mChronometer.start(); 
     showElapsedTime(); 
    } 
}; 

View.OnClickListener mStopListener = new OnClickListener() { 
    public void onClick(View v) { 
     mChronometer.stop(); 
     showElapsedTime(); 
    } 
}; 

View.OnClickListener mResetListener = new OnClickListener() { 
    public void onClick(View v) { 
     mChronometer.setBase(SystemClock.elapsedRealtime()); 
     showElapsedTime(); 
    } 
}; 
} 

天文臺一個有點令人困惑的事情是,你不能真正使用它作爲開始,停止並重新啓動的秒錶。當它運行時,它會一直顯示自上次重置之後所經過的時間,無論次數多少以及停止多長時間。停止時,只停止更新顯示。