5 Stimmen

Benutzerdefinierter Callback-Handler

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?

9voto

slott Punkte 3216

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...
        }
 });

3voto

slott Punkte 3216

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");
        }
    });

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