Cykliczne wywoływanie metody w klasie

Ponieważ piszę dynamiczną grę, więc nie obejdzie się bez cyklicznego wywoływania jakiejś metody, która będzie chociażby przesuwała klocki na ekranie, wyświetlała animacje, odgrywała dźwięki czy robiła inne fascynujące rzeczy. Jak na razie odkryłem dwa sposoby na cykliczne uruchamianie wskazanej metody.

Pierwszy z nich to stworzenie własnego handlera do komunikatów:

class RefreshHandler extends android.os.Handler {
 
       @Override
       public void handleMessage(Message msg) {
           NaszaKlasa.this.update();
       }
 
       public void sleep(long delayMillis) {
           this.removeMessages(0);
           sendMessageDelayed(obtainMessage(0), delayMillis);
       }
};

oraz w NaszaKlasa (nie mylić z nk.pl) odpowiedniej metody, którą handler będzie wywoływał:

public class NaszaKlasa extend View {
    private RefreshHandler mRedrawHandler = new RefreshHandler();
 
    public void update() {
       mRedrawHandler.sleep(100);
    }
}

Aby zainicjować cykliczne wykonywanie się metody update() należy ją pierwszy raz wywołać “ręcznie”; następnie będzie ona wywoływana co zadany interwał czasu (w przykładzie co 100ms) z poziomu klasy RefreshHandler.

Drugi, to użycie klasy java.util.Timer – ten sposób wydaje się początkowy bardziej oczywisty, jednak jest o tyle niewygodny, że wymaga rozszerzenia naszej klasy o TimerTask. Do mojej aplikacji wybrałem więc pierwsze rozwiązanie, jednak wcale nie będę zaskoczony, gdy okaże się, że istnieje inne, lepsze rozwiązanie. Z jednej strony dokumentacja androida mówi, że jednym z głównych celów, do których są używane handlery, jest “wykonywanie pewnych zdarzeń w przyszłości”, a ponieważ jest to klasa z API androida, więc powinna być odpowiednio zoptymalizowana do zadań, które wykonuje. Z drugiej strony, do takich celów zwykle używało się właśnie klas podobnych do klasy Timer, ale może pora na zmianę przyzwyczajeń. :)

O handlerach poczytacie więcej w dokumentacji: http://developer.android.com/reference/android/os/Handler.html