Java Reference
In-Depth Information
Der Typ Callback kann nun als Parametertyp in der AIDL-Schnittstelle Counter verwendet
werden. Wir ergänzen die AIDL-Schnittstelle Counter ein weiteres Mal um diese Methode:
void multiIncrement(int times, Callback cb);
Beim Aufruf dieser Methode soll der Zähler also times Mal erhöht werden und bei jeder
Erhöhung soll das Objekt cb, das der Aufrufer bereitstellt, durch Aufruf der Methode new-
CounterValue benachrichtigt werden. Die Implementierung von multiIncrement, die wir
hier nicht wiedergeben, erzeugt einen Thread, der times Mal die Methode increment aufru
und nach jeder Erhöhung cb zurückru .
Nun fehlt nur noch eine Implementierung der Schnittstelle Callback. Wie zuvor für Counter
wird zur Callback-Schnittstelle automatisch eine Java-Klasse namens Callback erzeugt. Zur
Implementierung muss man eine eigene Klasse aus der inneren Klasse Stub von Callback
ableiten. Die Methode newCounterValue soll den neuen Zählerwert in einem Textfeld auf
der Oberfl äche ausgeben. Unser erster naiver Realisierungsversuch sieht so aus:
package javacomp.android.boundservice;
import ...
public class CallbackImpl extends Callback.Stub
{
private TextView tv;
public CallbackImpl(TextView tv)
{
this.tv = tv;
}
public void newCounterValue(int newValue) throws RemoteException
{
tv.setText("neuer Wert: " + newValue);
}
}
So funktioniert es aber nicht, denn der Rückruf wird von einem eigenen Thread ausgeführt.
Aus Synchronisationsgründen darf in Android aber nur der Thread auf die Oberfl äc h e
zugreifen, der sie aufgebaut hat. Das ist in unserem Fall der Main-Thread. Die Situation ist
sehr ähnlich wie bei Java Swing. Auch hier sollte nur der Event-Dispatcher auf die Oberfl ä-
che zugreifen. Wenn man die Regel nicht einhält, begeht man einen Synchronisationsfehler,
der in Swing unter Umstä nden nicht auff ällt. In Android ist die Situation insofern besser, als
bei einem solchen Zugriff durch einen falschen Thread direkt eine Ausnahme geworfen
wird. Der Programmiererin wird also sofort der Fehler aufgezeigt.
Die Lösung des Problems ist auch ganz ähnlich wie in Java Swing. Man muss einen Au rag
an den Thread senden, der auf die Oberfl äche zugreifen darf. In Android braucht man dazu
einen Handler. Über einen Handler können Au räge an den Thread gesendet werden, der
das Handler-Objekt erzeugt hat. In unserem Fall muss also der Main-Thread das Handler-
Objekt erzeugen und als Parameter dem Konstruktor der Klasse CallbackImpl übergeben.
Für das Senden eines Au rags an einen Handler gibt es mehrere Varianten. Ich verwende
im Folgenden diejenige, die der von Swing sehr ähnlich ist: Ein Au rag ist ein Objekt einer
 
Search WWH ::




Custom Search