Java 在Android中停止秒表

Java 在Android中停止秒表,java,android,multithreading,button,stopwatch,Java,Android,Multithreading,Button,Stopwatch,我做了一个定制的秒表,显示小时:分钟:秒。控件由开始和停止按钮提供。但是,停止秒表时出现问题。单击停止按钮时,它没有停止。任何人请给我建议正确的解决方案 package com.example.mystopwatch; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.O

我做了一个定制的秒表,显示小时:分钟:秒。控件由开始和停止按钮提供。但是,停止秒表时出现问题。单击停止按钮时,它没有停止。任何人请给我建议正确的解决方案

    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);
     }
    }
package com.example.mystopwatch;
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.Handler;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
导入android.widget.TextView;
公共类StopWatch活动扩展了活动{
私有文本视图文本视图定时器;
私人按钮BtnStart,BtnStop;
私有处理程序mHandler=新处理程序();
私人长启动时间;
私密时间长;
私有最终整数刷新率=100;
私有字符串小时、分钟、秒、毫秒;
专用长秒、分钟、小时、毫秒;
私有布尔停止=false;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_秒表);
BtnStart=(按钮)findviewbyd(R.id.startbtn);
BtnStop=(按钮)findViewById(R.id.stopbtn);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
Runnable startTimer1=新的Runnable()
{ 
公开募捐
{
elapsedTime=System.currentTimeMillis()-startTime;updateTime(elapsedTime);
mHandler.postDelayed(这是刷新率);
}
};
如果(停止)
{
startTime=System.currentTimeMillis()-elapsedTime;
} 
其他的
{ 
startTime=System.currentTimeMillis();
} 
mHandler.removeCallbacks(startTimer1);
mHandler.postDelayed(startTimer1,0);
}
});
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
Runnable startTimer2=新的Runnable()
{ 
公开募捐
{
elapsedTime=System.currentTimeMillis()-startTime;updateTime(elapsedTime);
mHandler.postDelayed(这是刷新率);
}
};
mHandler.removeCallbacks(startTimer2);
停止=真;
}
});
}   
私有void updateTimer(长时间){
//TODO自动生成的方法存根
秒=(长)(时间/1000);
分钟=(长)((时间/1000)/60);
小时=(长)((时间/1000)/60)/60);
秒=秒%60;
秒=字符串.valueOf(秒);
如果(秒=0)
{ 
秒数=“00”;
} 
如果(秒0)
{ 
秒=“0”+秒;
}
分钟=分钟%60;
分钟=字符串.valueOf(分钟);
如果(分钟==0){minutes=“00”;
} 
如果(分钟0)
{
分钟=“0”+分钟;
}
小时=字符串的值(小时);
如果(小时==0)
{ 
小时数=“00”;
}
若有(小时0)
{
小时数=“0”+小时数;
}
毫秒=String.valueOf((长)时间);
if(毫秒.length()==2)
{
毫秒=“0”+毫秒;
}

如果
BtnStop.setOnClickListener
中的大多数代码(毫秒.length()实际上是无用的。您定义了一个名为startTimer2的可运行程序,但用于什么目的?除了在调用
mHandler.removeCallbacks(startTimer2)时,您从不使用该可运行程序;
。这将删除以前对它进行的任何调用,但由于您从未进行过任何调用,因此这不会起任何作用

单击“停止”按钮时,您的方法所做的唯一一件事是将布尔标志
stopped
设置为true。但没有定期检查该标志的过程。您唯一检查标志的时间是按下“开始”按钮时


作为一个旁注,您使用的<>代码>刷新率令人困惑。设置一个更高的数字实际上会导致一个较低的刷新率,因为延迟后需要一个持续时间。考虑重命名变量或添加一个除法。

< P>它不能停止,因为您没有检查<代码>布尔停止的< /代码>在您的代码>运行< /C> >方法中。:

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

并考虑声明中的声明为“代码>易失性/代码>”。

< P>有一个完整的任务启动和停止,秒表只是调用:--HANDLR.SDENEMPTYMENT(MSGSPSTOSTIMER);停止秒表

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;
        }
    }
};
Handler=newhandler()
{
@凌驾
公共无效handleMessage(消息消息消息){
超级handleMessage(msg);
开关(msg.what){
案例消息\u启动\u计时器:
timer.start();//启动计时器
handler.sendEmptyMessage(消息更新计时器);
打破
案例消息更新计时器:
//timerText.setText(String.format(“%1$tM:%1$tS”、timer.getelapsedtimin()、timer.getElapsedTimeSecs());
if(timer.getElapsedTimeSecs()<10)
{

如果(timer.getelapsedtimimin()您是否尝试使stopprd变为volatile?
volatile boolean stopped=false
您可以用谷歌搜索它。还有其他方法,但您必须确保在检查停止变量的地方可以看到停止变量的更改。用火杀死它!:)