2014-03-30 3 views
0

Я хотел бы создать секундомер в качестве приложения для Android. Моя проблема в том, что у меня есть stackoverflow. В основном у меня есть класс Timer и метод onCreate, который устанавливает его. Вот моя реализация:Stackoverflow inside thread - секундомер java

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. Может быть, это касается части дисплея?

ответ

3

Вы вызываете метод start рекурсивно внутри себя. Исправьте это, и вы не получите SO исключение.

Однако следует отметить, что даже если вы смените:

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

, который зафиксирует StackOverflow, ваш код будет работать в главном потоке, и поэтому ваше приложение не будет работать. Вы должны создать новый поток.

Я действительно предлагаю вам использовать CountDownTimer - это будет чистый код и меньше резьбы по шаблонам, посмотрите пример по ссылке.

Вы можете, однако, сделать код работу, делая это изменения:

  1. сделать Timer extends Thread вместо реализации Runnable.

  2. изменение start к:


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

При необходимости добавьте Override обозначения в start/stop методы, или переименовать stop ->stopTimer