我想创建一个秒表作为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。可能是它处理显示部分?
答案 0 :(得分:3)
您可以在其自身内递归调用start
方法。修复它,你不会得到SO异常。
但请注意,即使您更改为:
public void start(){
running = true;
this.run();
}
将修复stackoverflow,您的代码将在主线程中运行,因此您的应用程序无法正常工作。你必须产生一个新的线程。
我真的建议你使用CountDownTimer - 这将是干净的代码和更少的样板线程,请查看链接示例。
但是,您可以通过执行此更改来使代码正常工作:
制作Timer extends Thread
,而不是实施Runnable。
将start
更改为:
public void start(){
running = true;
super.start(); // <- note super here
}
(可选)向Override
方法添加start/stop
表示法,或重命名stop
- &gt; stopTimer