在线程内的Stackoverflow - 秒表java

时间:2014-03-30 08:54:01

标签: java android multithreading stack-overflow

我想创建一个秒表作为Android应用程序。我的问题是我有一个stackoverflow。基本上我有一个类Timer和一个onCreate方法来实现它。多数民众赞成我的实施:

public abstract class Timer implements Runnable {

    private boolean running;

    public void start(){
        running = true;
        this.start();
    }

    @Override
    public void run() {
        long milliSeconds = 0;
        long seconds = 0;
        long minutes = 0;

        long baseTime = SystemClock.elapsedRealtime();

        while(running){
            long time = SystemClock.elapsedRealtime() - baseTime;
            long rest = time % 60000;
            milliSeconds = rest % 1000;
            seconds = rest - milliSeconds;
            minutes = time - seconds - milliSeconds;
            display(milliSeconds, seconds, minutes);
        }
    }

    public void stop(){
        running = false;
    }

    public abstract void display(long milliSeconds, long seconds, long minutes);

}

我的onCreate方法:

public TextView time;

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.opslimit);

        time = (TextView)findViewById(R.id.textView3);

        Timer timer = new Timer(){
            @Override
            public void display(long milliSeconds, long seconds, long minutes) {
                time.setText(minutes + ":" + seconds + ":" + milliSeconds);
            }
        };

        timer.start();        
}

有谁知道我为什么得到Stackoverflow。可能是它处理显示部分?

1 个答案:

答案 0 :(得分:3)

您可以在其自身内递归调用start方法。修复它,你不会得到SO异常。

但请注意,即使您更改为:

    public void start(){
        running = true;
        this.run();
    }

将修复stackoverflow,您的代码将在主线程中运行,因此您的应用程序无法正常工作。你必须产生一个新的线程。

我真的建议你使用CountDownTimer - 这将是干净的代码和更少的样板线程,请查看链接示例。

但是,您可以通过执行此更改来使代码正常工作:

  1. 制作Timer extends Thread,而不是实施Runnable。

  2. start更改为:


  3. public void start(){
        running = true;
        super.start(); // <- note super here
    }
    

    (可选)向Override方法添加start/stop表示法,或重命名stop - &gt; stopTimer