2012-06-10 204 views
1

我有两个按钮“开始”和“暂停”和一个Textview。停止观看android - 暂停,然后开始并从停止的地方开始

我的问题是,当我按下暂停按钮,然后按下后启动按钮,秒表不会停止的地方开始。

感谢您的帮助

public class StopWatch extends Activity { 
    /** Called when the activity is first created. */ 

    private TextView timeflg; 
    private Button startButton; 
    private Button pauseButton; 
    private long mStartTime = 0L; 
    private Handler mHandler = new Handler(); 
    long millis = 0L; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     if (mStartTime == 0L) { 
      mStartTime = SystemClock.uptimeMillis(); 
      mHandler.removeCallbacks(mUpdateTimeTask); 
      mHandler.postDelayed(mUpdateTimeTask, 0); 


      } 

      timeflg = (TextView) findViewById(R.id.timeflag); 

      startButton = (Button) findViewById(R.id.start); 
      startButton.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view){ 

        mHandler.postDelayed(mUpdateTimeTask, 0); 

       } 
      }); 

      pauseButton = (Button) findViewById(R.id.pause); 
      pauseButton.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view){ 

        mHandler.removeCallbacks(mUpdateTimeTask); 

       } 
      }); 

    } 

    private Runnable mUpdateTimeTask = new Runnable() { 
      public void run() { 

        millis = SystemClock.uptimeMillis() - mStartTime; 

        int seconds = (int) (millis/1000); 
        int minutes = seconds/60; 
        seconds = seconds % 60; 
        int milliseconds = (int) (millis%1000); 
        timeflg.setText("" + minutes + ":" + String.format("%02d",seconds)+ ":" 
        + String.format("%03d",milliseconds)); 
        mHandler.postDelayed(this,0); 
      } 

    }; 



} 
+0

对于将来的参考,您需要选择您的所有代码,然后单击“{}”按钮,以确保所有代码都显示在代码块中。 –

+1

你的例子根本不是很清楚......你能澄清一下吗? –

+0

非常感谢,通常当您按下停止按钮时,定时器将停止,然后当您按下开始按钮时,它会再次启动定时器。时间不会重置为零,应该从停止的位置开始。我不确定我的代码出了什么问题。 – kevin

回答

5

有问题:在创建活动时

millis = SystemClock.uptimeMillis() - mStartTime;

mStartTime被初始化。 然后显示的时间是从mStartTime开始计算的。编辑:
我看你还是不明白。

初始化mStartTime按下启动按钮时,当前的推移开始时间:

 startButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view){ 
       mStartTime = SystemClock.uptimeMillis(); 
       mHandler.postDelayed(mUpdateTimeTask, 0); 
      } 
     }); 

计算mCurrenLapse时间。 显示时间是过去的失误和当前经过的时间的时间:

private Runnable mUpdateTimeTask = new Runnable() { 
     public void run() { 
       mCurrentLapse = SystemClock.uptimeMillis() - mStartTime; 
       // 
       long displayTime = mTime + mCurrentLapse; 
       . 
       . 
       . 

总时间是所有流逝的时间,点击时暂停然后当前时间经过被添加到总时间:

 pauseButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view){ 
       mTime += mCurrentLapse; 
       mHandler.removeCallbacks(mUpdateTimeTask); 
      } 
     }); 
+0

谢谢,我发现即使在我调用removeCallbacks()时,线程仍在运行?为什么? – kevin

+0

removeCallbacks()与处理程序连接并且没有任何线程。 – pawelzieba

+0

这是问题所在,我不想获得总时间,我想停止时间,然后从那个时间开始。按下暂停按钮后,我可以保存定时器吗? – kevin