4 Stimmen

Timer mit Rückruf

Infos

  • Ich habe eine Klasse SensorClass, die einige Sensoren verwaltet.
  • Ich habe eine Schnittstelle mit der Methode A().
  • Ich habe eine Testerklasse TestClass, die die Schnittstelle mit der Methode A() implementiert und diese Implementierung an SensorClass übergibt. TestClass erweitert Activity.

Zielsetzung

  • Alle X Sekunden muss ich die implementierte Methode der in SensorClass gespeicherten Schnittstelle aufrufen. Es ist ein Rückruf.

  • Ich weiß nicht, wie die Methode A() implementiert ist, so dass sie Ansichten ihrer Aktivität ändern kann.

  • Ich benötige einen Timer, weil ich den Callback - Ausführen der Methode A() aus der gespeicherten Schnittstelle in SensorClass - alle X Sekunden starten möchte. Daher tue ich das Folgende:

    public void do (){ timer.scheduleAtFixedRate (new TimerTask (){ public void run (){ storedInterface.A (); } }, 0, speed); }

  • Aber wie gesagt, ich weiß nicht, wie A() implementiert ist. Ich muss die Methode innerhalb von runOnUIThread() ausführen, weil sie Ansichten ändern kann.

    private void startCallback (){ runOnUiThread (new Runnable (){ public void run (){ storedInterface.A (); } }); }

    public void do (){ timer.scheduleAtFixedRate (new TimerTask (){ public void run (){ startCallback (); } }, 0, speed); }

  • Problem: SensorClass ist keine Activity, so dass runOnUIThread() einen Fehler verursacht.

Mögliche Abhilfe

Erweitern Sie SensorClass von einer Activity, aber SensorClass ist keine Activity mit Methoden onCreate(), onPause(), etc!!! Diese Lösung gefällt mir nicht.

Meine Frage ist: Wie kann ich runOnUIThread() innerhalb einer Klasse aufrufen, die nur einen Kontext von einer Activity empfängt? Oder... Gibt es eine andere Lösung für mein Problem?

Danke.

9voto

Gabriel Llamas Punkte 17757

Gelöst mit Handler. Tolles Werkzeug!

public void do (){
    final Handler handler = new Handler ();
    timer.scheduleAtFixedRate (new TimerTask (){
        public void run (){
            handler.post (new Runnable (){
                public void run (){
                    storedInterface.A ();
                }
            });
        }
    }, 0, speed);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X