Ich versuche, den Mechanismus des Callback-Handlers zu verstehen. Wie wird die Methode handle() aufgerufen? Kann jemand ein Beispiel für die Verwendung von benutzerdefinierten Callback-Handler (andere als die in Login-Module von JASS oder so verwendet) in nicht Swing-Anwendung geben?
Antworten
Zu viele Anzeigen?Definieren Sie eine Schnittstelle für den Rückruf.
public interface ServiceListener<T> {
void callback(T result);
}
Definieren Sie eine Methode, die ServiceListener als Parameter nimmt und void zurückgibt.
Public void runInBackground(ServiceListener listener) {
...code that runs in the background...
listener.callback(...data to return to caller...);
}
Und das können Sie jetzt von Ihrem Hauptcode aus tun:
runInBackground(new ServiceListener() {
@Override
public void callback(..returned data...) {
...Do stuff with returned data...
}
});
Dies ist ein einfaches Beispiel für die Abfrage von Daten von einem Webserver unter Verwendung von AsyncTask aus einer Android-Anwendung.
Definieren Sie zunächst die async-Klasse. Beachten Sie, dass der Konstruktor einen Listener benötigt, mit dem wir das Ergebnis veröffentlichen, sobald es fertig ist.
public class Webservice extends AsyncTask<String, Void, String> {
private DialogListener dialogListener;
public Webservice(final DialogListener dialogListener) {
this.dialogListener = dialogListener;
}
@Override
protected String doInBackground(final String... strings) {
// We cant trigger onComplete here as we are not on the GUI thread!
return "";
}
protected void onPostExecute(final String result) {
dialogListener.onComplete(result);
}
}
Grundlegende Serverklasse für die Handhabung verschiedener Netzwerkkommunikationen:
public class Server {
public void queryServer(final String url, final DialogListener service) {
// Simulate slow network...
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Webservice(service).execute(url);
}
}
Wir können diesen Code nun innerhalb unserer Aktivität verwenden, ohne uns Gedanken darüber machen zu müssen, wie lange der Aufruf dauert, da er die GUI nicht anhält, da er asynchron ausgeführt wird.
Server s = new Server();
// Async server call.
s.queryServer("http://onto.dk/actions/searchEvents.jsp?minLatE6=55640596&minLngE6=12078516&maxLatE6=55642654&maxLngE6=12081948", new DialogListener() {
@Override
public void onComplete(final String result) {
toast("complete");
}
@Override
public void onError() {
toast("error");
}
});