2014-11-25 89 views
0

我做了一个自定义秒表显示小时:minuted:seconds.Controls由START和STOP按钮给出。但是,停止秒表时出现问题。它并没有停止时点击STOP按钮。任何人都请给我建议正确的解决方案。停止在Android的秒表

package com.example.mystopwatch; 


import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 


public class StopwatchActivity extends Activity { 
private TextView textViewTimer; 
private Button BtnStart,BtnStop; 
private Handler mHandler = new Handler(); 
private long startTime; 
private long elapsedTime; 
private final int REFRESH_RATE = 100; 
private String hours,minutes,seconds,milliseconds; 
private long secs,mins,hrs,msecs; 
private boolean stopped = false; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_stopwatch); 
    BtnStart=(Button)findViewById(R.id.startbtn); 
    BtnStop=(Button)findViewById(R.id.stopbtn); 
    BtnStart.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Runnable startTimer1 = new Runnable() 
      { 
       public void run() 
       { 
        elapsedTime = System.currentTimeMillis() - startTime; updateTimer(elapsedTime); 
        mHandler.postDelayed(this,REFRESH_RATE); 
        } 


       }; 
      if(stopped) 
      { 
       startTime = System.currentTimeMillis() - elapsedTime; 
       } 
      else 
      { 
       startTime = System.currentTimeMillis(); 
       } 
      mHandler.removeCallbacks(startTimer1); 
      mHandler.postDelayed(startTimer1, 0); 


     } 
       }); 
    BtnStop.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Runnable startTimer2 = new Runnable() 
       { 
        public void run() 
        { 
         elapsedTime = System.currentTimeMillis() - startTime; updateTimer(elapsedTime); 
         mHandler.postDelayed(this,REFRESH_RATE); 
         } 


        }; 

      mHandler.removeCallbacks(startTimer2); 
      stopped = true; 

     } 
    }); 

} 
private void updateTimer(long time) { 
    // TODO Auto-generated method stub 

     secs = (long)(time/1000); 
    mins = (long)((time/1000)/60); 
    hrs = (long)(((time/1000)/60)/60); 
    secs = secs % 60; 
    seconds=String.valueOf(secs); 
    if(secs == 0) 
    { 
     seconds = "00"; 

    } 
    if(secs <10 && secs > 0) 
    { 
     seconds = "0"+seconds; 
     } 
    mins = mins % 60; 
    minutes=String.valueOf(mins); 
    if(mins == 0){ minutes = "00"; 
    } 
    if(mins <10 && mins > 0) 
    { 
     minutes = "0"+minutes; 
     } 
    hours=String.valueOf(hrs); 
    if(hrs == 0) 
    { 
     hours = "00"; 
     } 
    if(hrs <10 && hrs > 0) 
    { 
     hours = "0"+hours; 
     } 
    milliseconds = String.valueOf((long)time); 
    if(milliseconds.length()==2) 
    { 
     milliseconds = "0"+milliseconds; 
     } 
    if(milliseconds.length()<=1) 
    { milliseconds = "00"; 
    } 
    milliseconds = milliseconds.substring(milliseconds.length()-3, milliseconds.length()-2); 
    ((TextView)findViewById(R.id.timertxt)).setText(hours + ":" + minutes + ":" + seconds); 
    } 
    } 
+0

添加您的代码plz – 2014-11-25 06:22:08

+0

您是否试图让stopprd易失? – Fildor 2014-11-25 06:28:58

+0

该怎么做? – sreenadh 2014-11-25 06:33:46

回答

0

您的BtnStop.setOnClickListener中的大部分代码实际上是无用的。你定义了一个名为startTimer2的Runnable,但是为了什么目的?除了致电mHandler.removeCallbacks(startTimer2);之外,您从不使用该Runnable。这将消除之前所做的任何呼叫,但由于您从未做过任何事情,所以这不起任何作用。

当您单击停止按钮时,您的方法执行的唯一操作是将布尔标志stopped设置为true。但是没有定期检查该标志的过程。唯一一次检查标志是当按下START按钮时。

作为便笺,您使用REFRESH_RATE会造成混淆。由于postDelayed需要一个持续时间,因此设置较高的数字实际上会导致较低的刷新率。考虑重命名该变量或添加一个分区。

0

它不能停止,因为您不在run方法中检查boolean stopped。中移动它:

public void run() { 
    elapsedTime = System.currentTimeMillis() - startTime; 
    updateTimer(elapsedTime); 
    if(!stopped) { 
     mHandler.postDelayed(this, REFRESH_RATE); 
    } 
} 

,也考虑宣布停止为volatile按照建议的意见。

0

有整个任务启动和停止,stopwatch只是调用: - handler.sendEmptyMessage(MSG_STOP_TIMER);停止秒表

Handler handler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     switch (msg.what) { 
     case MSG_START_TIMER: 
      timer.start(); //start timer 

      handler.sendEmptyMessage(MSG_UPDATE_TIMER); 
      break; 

     case MSG_UPDATE_TIMER: 
      //timerText.setText(String.format("%1$tM:%1$tS",timer.getElapsedTimeMin(),timer.getElapsedTimeSecs())); 
      if (timer.getElapsedTimeSecs() < 10) 
      { 
       if(timer.getElapsedTimeMin()<10){ 
        timerText.setText("0" + timer.getElapsedTimeMin() + ":0" + timer.getElapsedTimeSecs()); 
       }else{ 
        timerText.setText("" + timer.getElapsedTimeMin() + ":0" + timer.getElapsedTimeSecs()); 
       } 
      } 
      else{ 
       if(timer.getElapsedTimeMin()<10){ 
        timerText.setText("0" + timer.getElapsedTimeMin() + ":" + timer.getElapsedTimeSecs()); 
       }else{ 
        timerText.setText(timer.getElapsedTimeMin()+":"+ timer.getElapsedTimeSecs()); 
       } 

      } 
      handler.sendEmptyMessageDelayed(MSG_UPDATE_TIMER,REFRESH_RATE); //text view is updated every second, 
      break;         //though the timer is still running 
     case MSG_STOP_TIMER: 
      handler.removeMessages(MSG_UPDATE_TIMER); // no more updates. 
      timer.stop();//stop timer 
      timerText.setText("0"+timer.getElapsedTimeMin()+":0"+ timer.getElapsedTimeSecs()); 
      break; 

     default: 
      break; 
     } 
    } 
};