Klasa Timer

fatalbomb

Bez klasy Timer trudno wyobrazić sobie napisanie jakiejkolwiek gry. W każdej grze musi istnieć "coś" wywoływane cyklicznie. W tym artykule dowiesz się, jak wstawić i używać Timer i TimerTask.

TimerTask

Klasy Timer i TimerTask znajdują się w pakiecie java.util. Zatem zacznij od razu od dołączenia go do programu.

Podobnie jak w przypadku Canvas, także i tutaj wyprowadzamy klasę dziedziczącą po czymś, a tym czymś jest właśnie tytułowa klasa TimerTask. Szkielet takiej konstrukcji jest wyjątkowo banalny:

 class MyTimerTask extends TimerTask
 {
  public void run()
  {
    //operacje do wykonania
  }
 }

Taką klasę najlepiej jest zadeklarować jako klasę wewnętrzną wewnątrz głównej klasy MIDletu. Dzięki temu mamy łatwy dostęp do wszystkich pól i metod.

Timer

Sama definicja pochodnej TimerTask jednak nie wystarczy. Musimy zaprogramować jej cykliczne wykonanie, i tu wchodzi zastosowanie klasy Timer. Typowa konstrukcja wygląda następująco:
Timer timer1 = new Timer();
MyTimerTask timer1_task = new MyTimerTask();
timer1.schedule (timer1_task, 0, 20);

Drugi parametr metody schedule określa, po ilu milisekundach timer ma ruszyć. Natomiast trzeci parametr definiuje interwał czasowy pomiędzy kolejnymi wywołaniami.

Deklarując timery musisz jednak uważać na pewną rzecz. Mianowicie, gdy wystąpi jakiś nieprzechwycony wyjątek w programie (czyli jeżeli przechwyci go maszyna wirtualna), timery mogą się powyłączać. Dlatego musisz przechwytywać co się da za pomocą konstrukcji try ... catch. Jeżeli wiesz, że w danym miejscu może takie coś się zdarzyć, od nowa zaprogramuj timer za pomocą instrukcji schedule.

Teraz, umiejąc wykorzystać [Game]Canvas oraz Timer i TimerTask, możesz zacząć pisać własne gry.

3 komentarzy

Bru2s: to zależy, co chcesz osiągnąć. W przykładach w manualu faktycznie używa się pętli while, ale timery są bardziej elastyczne i pozwalają na bardziej kontrolowane działanie kodu.

Chyba będzie potrzebna nowa podkategoria :)

Widzę że powstaje cała seria :) Bardzo się cieszę :) Mam tylko pytanie, czy główną pętle gry opierać o te Timery czy lepiej po prostu w funkcji rysującej dać pętle while? A może są jeszcze inne sposoby?