2013-10-16 6 views

cevap

21

Geri arama, başka bir kodun argüman olarak iletilmesini sağlayan bir kod parçasıdır. Java henüz işlev göstergelerini desteklemediğinden, Komut nesneleri olarak uygulanmaktadır.

Bir geri bildirim, genellikle yararlı olabilmek için bazı durumlara referans gösterecektir.

Geri çağırma uygulamasının kodunuza bağlı tüm bağımlılıkları olduğundan, kodunuz ile geri çağrıyı yürüten kod arasında dolaylı yol alırsınız.

+1

Bu iyi bir örneği, aşağıdaki eklemek istiyorum olan: Bir geri arama yöntemi, herhangi bir sınıf herhangi bir yöntem olabilir; sınıfın bir örneğine yapılan bir referans, başka bir sınıfta korunur ve bazı olay başka bir sınıfta gerçekleştiğinde, yöntemi birinci sınıftan çağırır. Başka herhangi bir yöntem çağrısından ayırt edildiği gibi bir geri çağırma yapan tek şey, bir nesneye, daha sonra, genellikle bir olayda, daha sonra, bir yönteme başvurmak amacıyla bir nesneye bir başvuru gönderme fikridir. – arcy

+0

Üzgünüz, ben java'da yeniyim. Bu anonim bir sınıf olmadan yapılabilir mi? Geri arama arayüzü olmak zorunda mı? Bu Geri Arama arayüzünü kullanmadan yapmanın bir yolu varsa, Geri Arama arayüzünü kullanmayan farklı bir örnek sağlayabilir misiniz? –

+0

@ImtiazAhmad Hayır, anonim sınıf örneği daha kısa yapmaktır. Bir "public class MyCallbackImpl Impres 'Callback" yaratabilirsiniz. –

3

Java'da geri arama yöntemi, bir olay (E olarak adlandır) gerçekleştiğinde çağrılan bir yöntemdir. Genellikle, belirli bir arabirimin uygulanmasını, sisteme E olayını tetiklemekten sorumlu olan uygulamaya geçirerek uygulayabilirsiniz (bkz. Örnek 1).

Ayrıca, daha büyük ve daha karmaşık sistemlerde, bir yönteme yalnızca açıklama ekleyebilir ve sistem, tüm açıklamalı yöntemleri tanımlayacak ve olay gerçekleştiğinde bunları arayacaktır (bkz. Örnek 2). Elbette sistem, yöntemin alması gereken parametreleri ve diğer kısıtlamaları tanımlar.

Örnek 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()); 

Örnek 2: Basit Words

//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

... Düz İngilizce bir geri arama işlevi "geri çağıran" şçi gibidir Görevini tamamladığında müdürü.

Arama işlevinden bazı bağlamları alarak başka bir işlevden bir işlevi çağırmaktan nasıl farklıdırlar? Başka bir işlevin bir işlevini çağırdığınız doğrudur, ancak anahtar, geriçağırımın bir Nesne gibi ele alındığıdır, bu nedenle sistemin durumuna göre çağrılacak İşlevi (Strateji Tasarım Kalıbı gibi) değiştirebilirsiniz. .

Yetenekleri acemi bir programcıya nasıl açıklanabilir? Geri aramaların gücü, sunucudan veri çekmesi gereken AJAX stili web sitelerinde kolayca görülebilir. Yeni verileri indirmek biraz zaman alabilir. Geri aramalar olmadan, yeni veriyi indirirken Kullanıcı Arayüzünüzün tamamı "donacak" ya da sadece bir parçası yerine tüm sayfayı yenilemeniz gerekecek. Geri arama ile, "şimdi yükleme" görüntüsünü ekleyebilir ve yüklendikten sonra yeni verilerle değiştirebilirsiniz.

bir geri olmayan bazı kod:

 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