2013-10-16 2 views

Antwort

21

Ein Rückruf ist ein Stück Code, den Sie als Argument an einen anderen Code übergeben, damit er ausgeführt wird. Da Java Funktionszeiger noch nicht unterstützt, werden sie als Command-Objekte implementiert. So etwas wie

Ein Rückruf wird in der Regel Bezug auf einen bestimmten Zustand halten, um tatsächlich nützlich zu sein.

Indem Sie die Callback-Implementierung alle Abhängigkeiten zu Ihrem Code haben, erhalten Sie eine Indirektion zwischen Ihrem Code und dem Code, der den Callback ausführt.

+1

Dies ist ein gutes Beispiel, würde ich folgendes hinzufügen: eine Callback-Methode jede Methode in jeder Klasse sein kann; Ein Verweis auf eine Instanz der Klasse wird in einer anderen Klasse beibehalten, und wenn ein Ereignis in dieser anderen Klasse auftritt, wird die Methode von der ersten Klasse aufgerufen. Das einzige, was es zu einem Callback macht, unterscheidet sich von jedem anderen Methodenaufruf durch die Idee, einen Verweis auf ein Objekt zu übergeben, damit dieses Objekt später auf eine Methode, meist auf ein Ereignis, zugreift. – arcy

+0

Entschuldigung, ich bin neu in Java. Könnte das ohne eine anonyme Klasse gemacht werden? Muss es eine Callback-Schnittstelle sein? Können Sie ein anderes Beispiel angeben, das die Callback-Schnittstelle nicht verwendet, wenn es möglich ist, dies ohne Verwendung dieser Callback-Schnittstelle zu tun? –

+0

@ImtiazAhmad Nein, die anonyme Klasse soll das Beispiel kürzer machen. Sie könnten eine öffentliche Klasse erstellen, die MyCallbackImpl Callback implementiert. –

3

Eine Callback-Methode in Java ist eine Methode, die aufgerufen wird, wenn ein Ereignis (E) auftritt. Normalerweise können Sie dies implementieren, indem Sie eine Implementierung einer bestimmten Schnittstelle an das System übergeben, das für das Auslösen des Ereignisses E zuständig ist (siehe Beispiel 1).

Auch in größeren und komplexeren Systemen können Sie einfach eine Methode annotieren und das System wird alle annotierten Methoden identifizieren und sie aufrufen, wenn das Ereignis eintritt (siehe Beispiel 2). Natürlich definiert das System, welche Parameter die Methode erhalten soll und andere Einschränkungen.

Beispiel 1:

public interface Callback { 
    //parameters can be of any types, depending on the event defined 
    void callbackMethod(String aParameter); 
} 


public class CallbackImpl implements Callback { 
    void callbackMethod(String aParameter) { 
    //here you do your logic with the received paratemers 
    //System.out.println("Parameter received: " + aParameter); 

    } 
} 

//.... and then somewhere you have to tell the system to add the callback method 
//e.g. systemInstance.addCallback(new CallbackImpl()); 

Beispiel 2:

//by annotating a method with this annotation, the system will know which method it should call. 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface CallbackAnnotation {} 


public class AClass { 

    @CallbackAnnotation 
    void callbackMethod(String aParameter) { 
    //here you do your logic with the received paratemers 
    //System.out.println("Parameter received: " + aParameter); 

    } 
} 

//.... and then somewhere you have to tell the system to add the callback class 
//and the system will create an instance of the callback class 
//e.g. systemInstance.addCallbackClass(AClass.class); 
1

In einfachen Worten ... In einfachem Englisch, ist eine Callback-Funktion wie ein Arbeiter, die "ruft zurück" zu sein Manager, wenn er eine Aufgabe abgeschlossen hat.

Wie unterscheiden sie sich vom Aufruf einer Funktion von einer anderen Funktion, die einen Kontext von der aufrufenden Funktion nimmt? Es stimmt, dass Sie eine Funktion von einer anderen Funktion aufrufen, aber der Schlüssel ist, dass der Callback wie ein Objekt behandelt wird. Sie können also die Funktion ändern, die basierend auf dem Systemstatus aufgerufen wird (wie das Strategieentwurfsmuster). .

Wie kann ihre Macht zu einem Anfänger-Programmierer erklärt werden? Die Macht der Rückrufe kann leicht in AJAX-style Websites gesehen werden, die Daten von einem Server abrufen müssen. Das Herunterladen der neuen Daten kann einige Zeit dauern. Ohne Rückrufe würde Ihre gesamte Benutzeroberfläche während des Herunterladens der neuen Daten "einfrieren", oder Sie müssten die gesamte Seite aktualisieren und nicht nur einen Teil davon. Mit einem Callback können Sie ein "jetzt ladendes" Bild einfügen und nach dem Laden durch die neuen Daten ersetzen.

Einiger Code ohne Rückruf:

 function grabAndFreeze() { 
    showNowLoading(true); 
    var jsondata = getData('http://yourserver.com/data/messages.json'); 
    /* User Interface 'freezes' while getting data */ 
    processData(jsondata); 
    showNowLoading(false); 
    do_other_stuff(); // not called until data fully downloaded 
     } 

     function processData(jsondata) { // do something with the data 
    var count = jsondata.results ? jsondata.results.length : 0; 
    $('#counter_messages').text(['Fetched', count, 'new items'].join(' ')); 
    $('#results_messages').html(jsondata.results || '(no new messages)'); 
     } 
     **With Callback:** 
     Here is an example with a callback, using jQuery's getJSON: 

    function processDataCB(jsondata) { // callback: update UI with results 
    showNowLoading(false); 
    var count = jsondata.results ? jsondata.results.length : 0; 
    $('#counter_messages').text(['Fetched', count, 'new items'].join(' ')); 
    $('#results_messages').html(jsondata.results || '(no new messages)'); 
      } 

` `function grabAndGo() { // and don't freeze 
    showNowLoading(true); 
    $('#results_messages').html(now_loading_image); 
    $.getJSON("http://yourserver.com/data/messages.json", processDataCB); 
    /* Call processDataCB when data is downloaded, no frozen User Interface!        
    do_other_stuff(); // called immediately 
Verwandte Themen