Geri arama işlevi nedir?
Geri arama işlevi nedir?
Yanıtlar:
Geliştiriciler genellikle lanet olası şeyin adı nedeniyle geri arama ne olduğu ile karıştırılır.
Geri arama işlevi, aşağıdakiler olan bir işlevdir:
Bir geri çağırma işlevinin nasıl çalıştığını hayal etmenin güzel bir yolu, bu işlevin aktarıldığı işlevin " arka tarafında " olarak adlandırılan bir işlev olmasıdır .
Belki daha iyi bir isim "sonradan ara" işlevi olabilir.
Bu yapı, önceki bir etkinlik tamamlandığında bir etkinliğin gerçekleşmesini istediğimiz eşzamansız davranışlar için çok kullanışlıdır.
pseudocode:
// A function which accepts another function as an argument
// (and will automatically invoke that function when it completes - note that there is no explicit call to callbackFunction)
funct printANumber(int number, funct callbackFunction) {
printout("The number you provided is: " + number);
}
// a function which we will use in a driver function as a callback function
funct printFinishMessage() {
printout("I have finished printing numbers.");
}
// Driver method
funct event() {
printANumber(6, printFinishMessage);
}
Event () öğesini çağırdıysanız sonuç:
The number you provided is: 6
I have finished printing numbers.
Buradaki çıktının sırası önemlidir. Geri arama işlevleri daha sonra çağrıldığından, ilk olarak değil, "Yazdırma numaralarını bitirdim" en son yazdırılır.
Geri aramalar, işaretçi dilleriyle kullanımları nedeniyle adlandırılır. Bunlardan birini kullanmazsanız, 'geri arama' adı üzerinde çalışmayın. Başka bir yönteme argüman olarak sağlanan bir yöntemi açıklamanın sadece bir ad olduğunu anlayın, böylece üst yöntem çağrıldığında (düğme tıklaması, bir zamanlayıcı onaylaması gibi herhangi bir koşul) ve yöntem gövdesi tamamlandığında, sonra geri arama işlevi çağrılır.
Bazı diller, birden çok geri çağırma işlevi bağımsız değişkeninin desteklendiği yapıları destekler ve üst işlevin nasıl tamamlandığına bağlı olarak çağrılır (örneğin, ana işlevin başarıyla tamamlanması durumunda bir geri çağrı çağrılır, üst işlevin bir özel hata, vb.).
once its parent method completes, the function which this argument represents is then called
. Fonksiyonu gibi üst işlevinin çalışma zamanı ortasından argüman olarak başka bir işleve geçirilen ancak denir Yani parent(cb) {dostuff1(); cb(); dostuff2()}
bu bir kabul edilmez sonra callback
işlev?
Geri arama işlevi, başka bir kod parçasına sağladığınız ve bu kod tarafından çağrılmasını sağlayan bir işlevdir.
Bunu neden yapmak istiyorsun? Diyelim ki çağırmanız gereken bir hizmet var. Hizmet hemen geri dönerse, şunları yaparsınız:
Örneğin, hizmetin factorial
işlev olduğunu varsayalım . Değerini 5!
istediğinizde çağırırsınız factorial(5)
ve aşağıdaki adımlar gerçekleşir:
Geçerli yürütme konumunuz kaydedilir (yığına, ancak bu önemli değil)
Yürütme, factorial
Ne zaman factorial
tamamlamalar, bu sonuca koyar bir yerde binebilirsek
İcra, bulunduğu yere geri döner [1]
Diyelim ki factorial
çok uzun zaman aldı, çünkü ona büyük sayılar veriyorsunuz ve bir yerde süper hesaplama kümesinde çalışması gerekiyor. Diyelim ki sonucunuzun geri gelmesi 5 dakika sürüyor. Yapabilirdin:
Tasarımınızı koruyun ve uyurken gece programınızı çalıştırın, böylece ekranın yarısına bakmıyorsunuz
factorial
Yaparken başka şeyler yapmak için programınızı tasarlayın
İkinci seçeneği seçerseniz, geri aramalar sizin için işe yarayabilir.
Bir geri arama modelinden yararlanmak için, istediğiniz factorial
şekilde aşağıdaki şekilde arama yapabilirsiniz :
factorial(really_big_number, what_to_do_with_the_result)
İkinci parametre,, geri göndermeden önce sonucuna çağıracağı umuduyla what_to_do_with_the_result
birlikte gönderdiğiniz bir işlevdir .factorial
factorial
Evet, bu, factorial
geri çağrıları desteklemek için yazılmış olması gerektiği anlamına gelir .
Şimdi geri aramalarınıza bir parametre iletmek istediğinizi varsayalım. Şimdi yapamazsınız, çünkü onu aramayacaksınız factorial
. Bu nedenle factorial
, parametrelerinizi iletmenize izin vermek için yazılması gerekir ve çağırdığında bunları geri aramanıza iletir. Şöyle görünebilir:
factorial (number, callback, params)
{
result = number! // i can make up operators in my pseudocode
callback (result, params)
}
Şimdi factorial
bu kalıba izin veriyor, geri aramanız şöyle görünebilir:
logIt (number, logger)
{
logger.log(number)
}
ve aramanız factorial
olacaktır
factorial(42, logIt, logger)
Ya bir şeyi geri döndürmek istiyorsan logIt
? Yapamazsınız, çünkü factorial
buna dikkat etmiyor.
Peki, neden factorial
geri aramalarınızın geri döndüğünü geri veremiyorsunuz ?
Yürütme işlemi factorial
bittiğinde geri aramaya verilmesi gerektiği için, gerçekten arayanına hiçbir şey döndürmemelidir. Ve ideal olarak, bir şekilde çalışmasını başka bir iş parçacığında / işlemde / makinede başlatır ve hemen geri dönebilir, böylece devam edebilirsiniz, belki böyle bir şey:
factorial(param_1, param_2, ...)
{
new factorial_worker_task(param_1, param_2, ...);
return;
}
Bu artık "eşzamansız bir çağrı" dır, yani onu aradığınızda hemen geri döner ancak henüz işini gerçekten yapmamıştır. Bu yüzden, onu kontrol etmek ve bittiğinde sonucunu elde etmek için mekanizmalara ihtiyacınız var ve programınız süreçte daha karmaşık hale geldi.
Bu arada, bu kalıbı kullanarak factorial_worker_task
geri çağrınızı eşzamansız olarak başlatabilir ve hemen geri dönebilirsiniz.
Cevap, geri arama modeli içinde kalmaktır. Ne zaman yazmak istersen
a = f()
g(a)
ve f
eşzamansız olarak çağrılmak yerine,
f(g)
nerede g
geri arama olarak geçirilir.
Bu, programınızın akış topolojisini temelden değiştirir ve alışmak biraz zaman alır.
Programlama diliniz, anında işlevler oluşturmanıza olanak tanıyarak size çok yardımcı olabilir. Yukarıdaki kodda, işlev g
kadar küçük olabilir print (2*a+1)
. Eğer diliniz bunu tamamen gereksiz bir isim ve imzayla ayrı bir işlev olarak tanımlamanızı gerektiriyorsa, bu deseni çok kullanırsanız hayatınız hoşlanmaz.
Öte yandan, diliniz lambdalar oluşturmanıza izin veriyorsa, o zaman çok daha iyi durumdasınız demektir. Sonunda böyle bir şey yazacaksın
f( func(a) { print(2*a+1); })
ki bu çok daha hoş.
Geri arama işlevini nasıl iletirsiniz factorial
? Bunu birkaç şekilde yapabilirsiniz.
Aranan işlev aynı işlemde çalışıyorsa, bir işlev işaretçisi iletebilirsiniz
Ya da belki fn name --> fn ptr
programınızda bir sözlük tutmak istersiniz , bu durumda adı geçebilirsiniz
Belki de diliniz, yerinde lambda olarak mümkün olan işlevi tanımlamanıza izin verir! Dahili olarak bir tür nesne yaratıyor ve bir işaretçi geçiriyor, ancak bunun için endişelenmenize gerek yok.
Belki de aradığınız işlev tamamen ayrı bir makinede çalışıyor ve HTTP gibi bir ağ protokolü kullanarak çağırıyorsunuz. Geri aramanızı HTTP tarafından çağrılabilir bir işlev olarak gösterebilir ve URL'sini iletebilirsiniz.
Kaptın bu işi.
Girdiğimiz bu web çağında, çağırdığımız hizmetler genellikle ağ üzerinden gerçekleşiyor. Genellikle bu hizmetler üzerinde herhangi bir kontrole sahip değiliz, yani bunları yazmadık, bakımını yapmıyoruz, bunların çalışmasını veya nasıl performans gösterdiğini garanti edemeyiz.
Ancak bu hizmetlerin yanıt vermesini beklerken programlarımızın engellenmesini bekleyemeyiz. Bunun farkında olarak, servis sağlayıcılar genellikle geri arama modelini kullanarak API'ler tasarlar.
JavaScript, lambdas ve kapaklar gibi geri çağrıları çok güzel bir şekilde destekler. JavaScript dünyasında hem tarayıcıda hem de sunucuda çok fazla etkinlik var. Mobil cihazlar için geliştirilen JavaScript platformları bile var.
İlerledikçe, gittikçe daha fazla, bu anlayışın gerekli olacağı asenkron kod yazacağız.
Geri aramanın tek bir kelime olduğunu unutmayın.
Vikipedi geri arama sayfası bunu çok iyi açıklıyor.
wikipedia sayfasından alıntı:
Bilgisayar programlamasında geri arama, diğer koda argüman olarak iletilen yürütülebilir koda veya yürütülebilir kodun bir başvurusudur. Bu, daha düşük seviyeli bir yazılım katmanının daha yüksek seviyedeki bir katmanda tanımlanan bir alt programı (veya işlevi) çağırmasını sağlar.
Geri arama işlevi, belirli bir koşul gerçekleştiğinde çağrılması gereken işlevdir. Hemen geri çağrılmak yerine, geri arama işlevi gelecekte belirli bir noktada çağrılır.
Genellikle eşzamansız olarak bitecek bir görev başlatıldığında kullanılır (yani, çağrı işlevi döndükten bir süre sonra sona erer).
Örneğin, bir web sayfası isteme eden bir işlev, arayan kişinin web sayfasının indirilmesi bittiğinde çağrılacak bir geri arama işlevi sağlamasını gerektirebilir.
"...when a condition is met"
ama üst işlev yürütmeyi bitirdiğinde ve koşullara (?) Bağlı olmadığında geri aramaların çağrıldığını düşündüm.
Geri aramalar, telefon sistemi açısından en kolay tanımlanır. İşlev çağrısı, birini telefonla aramaya, ona bir soru sormaya, bir cevap almaya ve telefonu kapatmaya benzer; bir geri arama eklemek benzetmeyi değiştirir, böylece ona bir soru sorduktan sonra, ona adınızı ve numaranızı da verirsiniz, böylece sizi cevapla geri arayabilir.
- Paul Jakubik, "C ++ 'da Geri Arama Uygulamaları"
Bu "geri arama" jargonunun birçok yerde yanlışlıkla kullanılmış olduğuna inanıyorum. Benim tanımım şöyle bir şey olurdu:
Geri arama işlevi, birisine ilettiğiniz ve belirli bir zamanda onu aramasına izin verdiğiniz bir işlevdir.
Bence insanlar wiki tanımının ilk cümlesini okudular:
geri arama, diğer koda argüman olarak iletilen yürütülebilir koda başvuru veya yürütülebilir bir kod parçasıdır.
Çok sayıda API ile çalışıyorum, çeşitli kötü örneklere bakın. Birçok kişi bir işlev işaretçisi (çalıştırılabilir koda başvuru) veya anonim işlevleri (bir çalıştırılabilir kod parçası) "geri arama" olarak adlandırılır.
Aslında wiki tanımındaki sadece ikinci cümle, bir geri çağırma işlevi ile normal bir işlev arasındaki farkları gösterir:
Bu, daha düşük seviyeli bir yazılım katmanının daha yüksek seviyedeki bir katmanda tanımlanan bir alt programı (veya işlevi) çağırmasını sağlar.
bu yüzden fark, fonksiyonu kimin geçeceği ve fonksiyona nasıl geçeceğinizdir. Bir işlevi tanımlayıp başka bir işleve geçirirseniz ve doğrudan bu işlev gövdesinde çağırırsanız, bu işlevi geri arama olarak adlandırmayın. Tanımda, geçtiğiniz işlev "alt düzey" işlevi olarak adlandırılacaktır.
Umarım insanlar bu kelimeyi belirsiz bağlamda kullanmayı bırakabilirler, bu sadece insanların daha iyi anlamalarına yardımcı olamaz.
Basit tutalım. Geri arama işlevi nedir?
Parable ve Analogy'den Örnek
Bir sekreterim var. Her gün ondan: (i) firmanın postaneye giden postasını bırakmasını ve bunu yaptıktan sonra şunları yapmasını isterim: (ii) bu yapışkan notlardan birinde ona yazdığım herhangi bir görev .
Şimdi, yapışkan notun görevi nedir? Görev günden güne değişir.
Diyelim ki bu gün, bazı belgeleri yazdırmasını istiyorum. Bu yüzden yapışkan not üzerine yazıyorum ve yayınlaması gereken giden posta ile birlikte masasına sabitliyorum.
Özetle:
Geri arama işlevi ikinci görevdir: bu belgelerin yazdırılması. Çünkü posta bırakıldıktan SONRA yapılır ve ayrıca dokümanı yazdırmasını söyleyen yapışkan not, göndermesi gereken posta ile birlikte ona verilir.
Şimdi bunu programlama kelime dağarcığına bağlayalım
Hepsi bu kadar. Başka bir şey yok. Umarım bu sizin için temizlenir - ve değilse, bir yorum gönderin ve açıklığa kavuşturmak için elimden geleni yapacağım.
Bu, yöntemlerin sonunda geri çağrıları return ifadeleri gibi gösterir.
Onların ne olduğundan emin değilim.
Bence geri çağrılar aslında başka bir işlevin çağrılması ve tamamlanması sonucunda bir işleve çağrıdır.
Ben de geri aramaların menşeli çağrıyı ele almayı amaçladığını düşünüyorum.
Nedir geri arama ?
Bir nedir geri arama fonksiyonu ?
otherFunction
bir parametre olarak), ve geri arama fonksiyonu içinde denir (veya yürütülen) olup otherFunction
. function action(x, y, callback) {
return callback(x, y);
}
function multiplication(x, y) {
return x * y;
}
function addition(x, y) {
return x + y;
}
alert(action(10, 10, multiplication)); // output: 100
alert(action(10, 10, addition)); // output: 20
SOA'da geri arama, Eklenti Modüllerinin kaptan / ortamdan hizmetlere erişmesine izin verir.
Analoji: Geri aramalar. Asenkron. Engellemeyen
gerçek geri arama örneği
Sonra Arama aptal adından daha iyi bir isim olacaktır, geri arama . Bir işlev içinde koşul sağlandığında veya karşılaşıldığında, bağımsız değişken olarak alınan başka bir işlevi, Sonra Ara işlevini çağırın .
Bir işlev içindeki bir iç işlevi sabit kodlamak yerine, önceden yazılmış bir Call After işlevini bağımsız değişken olarak kabul etmek için bir işlev yazar . Sonra Çağrı devlet değişikliklere dayanarak denilen olsun olabilir argüman alan işlevindeki kod tarafından tespit edildi.
Geri arama işlevi, bir eylem tamamlandığında çağrılacak, ek işleme vb. Gerektiren mevcut bir işleve / yönteme belirttiğiniz bir işlevdir.
Örneğin, Javascript'te veya daha spesifik olarak jQuery'de, bir animasyon bittiğinde çağrılacak bir geri çağrı argümanı belirtebilirsiniz.
PHP'de bu preg_replace_callback()
işlev, normal ifade eşleştirildiğinde çağrılacak ve argüman olarak eşleştirilen dizeleri geçirecek bir işlev sağlamanıza olanak tanır.
resme bak :)
Ana program geri çağırma işlevi adıyla kütüphane işlevini (sistem düzeyi işlevi de olabilir) çağırır. Bu geri arama işlevi birden çok şekilde uygulanabilir. Ana program, gereksinime göre bir geri arama seçer.
Son olarak, kütüphane işlevi yürütme sırasında geri arama işlevini çağırır.
Bu sorunun basit cevabı, bir geri çağırma işlevinin, bir işlev işaretçisi aracılığıyla çağrılan bir işlev olmasıdır. Bir işlevin işaretçisini (adresini) başka bir değişkene argüman olarak iletirseniz, bu işaretçi işlevi çağırmak için kullanıldığında işaret ettiği bir geri arama yapıldığı söylenir.
sort(int *arraytobesorted,void (*algorithmchosen)(void))
Bir işlev işaretçisini argümanı olarak kabul edebileceği bir işleve sahip olduğumuzu varsayalım sort()
. Ardından, burada işlev işaretçisi tarafından adreslenen koda geri arama işlevialgorithmchosen
denir .
Ve avantajı görmek gibi bir algoritma seçebilirsiniz:
1. algorithmchosen = bubblesort
2. algorithmchosen = heapsort
3. algorithmchosen = mergesort ...
Diyelim ki prototip ile uygulandı:
1. `void bubblesort(void)`
2. `void heapsort(void)`
3. `void mergesort(void)` ...
Nesneye Yönelik Programlamada Çok Biçimlilik Sağlamada Kullanılan Bir Kavram
“Bilgisayar programlamasında geri arama, diğer koda argüman olarak iletilen yürütülebilir koda ya da yürütülebilir koda bir referanstır. Bu, daha düşük seviyeli bir yazılım katmanının, daha yüksek seviyedeki bir katmanda tanımlanan bir alt programı (veya işlevi) çağırmasını sağlar. ” - Wikipedia
İşlev İşaretçisi'ni kullanarak C'de geri arama
C'de geri arama İşlev İşaretçisi kullanılarak gerçekleştirilir. İşlev İşaretçisi - adından da anlaşılacağı gibi, bir işlevin işaretçisidir.
Örneğin, int (* ptrFunc) ();
Burada, ptrFunc argüman almayan ve bir tamsayı döndüren bir fonksiyonun göstergesidir. Parantez içine almayı unutmayın, aksi takdirde derleyici hiçbir şey almayan ve bir tamsayıya bir işaretçi döndüren normal bir işlev adı olduğunu varsayar.
İşlev işaretçisini göstermek için bazı kodlar.
#include<stdio.h>
int func(int, int);
int main(void)
{
int result1,result2;
/* declaring a pointer to a function which takes
two int arguments and returns an integer as result */
int (*ptrFunc)(int,int);
/* assigning ptrFunc to func's address */
ptrFunc=func;
/* calling func() through explicit dereference */
result1 = (*ptrFunc)(10,20);
/* calling func() through implicit dereference */
result2 = ptrFunc(10,20);
printf("result1 = %d result2 = %d\n",result1,result2);
return 0;
}
int func(int x, int y)
{
return x+y;
}
Şimdi fonksiyon göstergesini kullanarak C'deki Geri Arama kavramını anlamaya çalışalım.
Tüm programın üç dosyası vardır: callback.c, reg_callback.h ve reg_callback.c.
/* callback.c */
#include<stdio.h>
#include"reg_callback.h"
/* callback function definition goes here */
void my_callback(void)
{
printf("inside my_callback\n");
}
int main(void)
{
/* initialize function pointer to
my_callback */
callback ptr_my_callback=my_callback;
printf("This is a program demonstrating function callback\n");
/* register our callback function */
register_callback(ptr_my_callback);
printf("back inside main program\n");
return 0;
}
/* reg_callback.h */
typedef void (*callback)(void);
void register_callback(callback ptr_reg_callback);
/* reg_callback.c */
#include<stdio.h>
#include"reg_callback.h"
/* registration goes here */
void register_callback(callback ptr_reg_callback)
{
printf("inside register_callback\n");
/* calling our callback function my_callback */
(*ptr_reg_callback)();
}
Bu programı çalıştırırsak, çıktı
Bu, ana programın içindeki my_callback içinde register_callback içinde fonksiyon geri aramasını gösteren bir programdır
Daha yüksek katman işlevi, alt katman işlevini normal arama olarak çağırır ve geri arama mekanizması, alt katman işlevinin, daha yüksek katman işlevini bir işaretçi aracılığıyla geri arama işlevine çağırmasını sağlar.
Arabirimi Kullanarak Java'da Geri Arama
Java işlev işaretçisi kavramına sahip değildir Arayüz mekanizması aracılığıyla Geri Arama mekanizmasını uygular Burada işlev işaretçisi yerine, callee görevini bitirdiğinde çağrılacak bir yönteme sahip bir Arabirim bildiririz
Bir örnekle göstereyim:
Geri Arama Arayüzü
public interface Callback
{
public void notify(Result result);
}
Arayan veya Üst Seviye Sınıfı
public Class Caller implements Callback
{
Callee ce = new Callee(this); //pass self to the callee
//Other functionality
//Call the Asynctask
ce.doAsynctask();
public void notify(Result result){
//Got the result after the callee has finished the task
//Can do whatever i want with the result
}
}
Callee veya alt katman işlevi
public Class Callee {
Callback cb;
Callee(Callback cb){
this.cb = cb;
}
doAsynctask(){
//do the long running task
//get the result
cb.notify(result);//after the task is completed, notify the caller
}
}
EventListener desenini kullanarak geri arama
Bu model, belirli bir görevin tamamlandığını 0 ile n arasında sayıda Gözlemci / Dinleyici bildirmek için kullanılır
Geri arama mekanizması ile EventListener / Observer mekanizması arasındaki fark, geri aramada, arayan kişinin tek bir arayanı bildirmesidir, oysa Eventlisener / Observer'da, arayan kişi o olayla ilgilenen herkesi bilgilendirebilir (bildirim, görevi tetiklemeyen uygulama)
Bir örnekle açıklayayım.
Olay Arayüzü
public interface Events {
public void clickEvent();
public void longClickEvent();
}
Sınıf Widget'ı
package com.som_itsolutions.training.java.exampleeventlistener;
import java.util.ArrayList;
import java.util.Iterator;
public class Widget implements Events{
ArrayList<OnClickEventListener> mClickEventListener = new ArrayList<OnClickEventListener>();
ArrayList<OnLongClickEventListener> mLongClickEventListener = new ArrayList<OnLongClickEventListener>();
@Override
public void clickEvent() {
// TODO Auto-generated method stub
Iterator<OnClickEventListener> it = mClickEventListener.iterator();
while(it.hasNext()){
OnClickEventListener li = it.next();
li.onClick(this);
}
}
@Override
public void longClickEvent() {
// TODO Auto-generated method stub
Iterator<OnLongClickEventListener> it = mLongClickEventListener.iterator();
while(it.hasNext()){
OnLongClickEventListener li = it.next();
li.onLongClick(this);
}
}
public interface OnClickEventListener
{
public void onClick (Widget source);
}
public interface OnLongClickEventListener
{
public void onLongClick (Widget source);
}
public void setOnClickEventListner(OnClickEventListener li){
mClickEventListener.add(li);
}
public void setOnLongClickEventListner(OnLongClickEventListener li){
mLongClickEventListener.add(li);
}
}
Sınıf Düğmesi
public class Button extends Widget{
private String mButtonText;
public Button (){
}
public String getButtonText() {
return mButtonText;
}
public void setButtonText(String buttonText) {
this.mButtonText = buttonText;
}
}
Sınıf Onay Kutusu
public class CheckBox extends Widget{
private boolean checked;
public CheckBox() {
checked = false;
}
public boolean isChecked(){
return (checked == true);
}
public void setCheck(boolean checked){
this.checked = checked;
}
}
Etkinlik Sınıfı
paket com.som_itsolutions.training.java.exampleeventlistener;
public class Activity implements Widget.OnClickEventListener
{
public Button mButton;
public CheckBox mCheckBox;
private static Activity mActivityHandler;
public static Activity getActivityHandle(){
return mActivityHandler;
}
public Activity ()
{
mActivityHandler = this;
mButton = new Button();
mButton.setOnClickEventListner(this);
mCheckBox = new CheckBox();
mCheckBox.setOnClickEventListner(this);
}
public void onClick (Widget source)
{
if(source == mButton){
mButton.setButtonText("Thank you for clicking me...");
System.out.println(((Button) mButton).getButtonText());
}
if(source == mCheckBox){
if(mCheckBox.isChecked()==false){
mCheckBox.setCheck(true);
System.out.println("The checkbox is checked...");
}
else{
mCheckBox.setCheck(false);
System.out.println("The checkbox is not checked...");
}
}
}
public void doSomeWork(Widget source){
source.clickEvent();
}
}
Diğer Sınıf
public class OtherClass implements Widget.OnClickEventListener{
Button mButton;
public OtherClass(){
mButton = Activity.getActivityHandle().mButton;
mButton.setOnClickEventListner(this);//interested in the click event //of the button
}
@Override
public void onClick(Widget source) {
if(source == mButton){
System.out.println("Other Class has also received the event notification...");
}
}
Ana sınıf
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Activity a = new Activity();
OtherClass o = new OtherClass();
a.doSomeWork(a.mButton);
a.doSomeWork(a.mCheckBox);
}
}
Yukarıdaki koddan da görebileceğiniz gibi, temelde uygulamamız için olabilecek tüm olayları listeleyen olaylar adında bir arayüze sahibiz. Widget sınıfı, Button, Checkbox gibi tüm UI bileşenleri için temel sınıftır. Bu kullanıcı arabirimi bileşenleri, olayları çerçeve kodundan gerçekten alan nesnelerdir. Widget sınıfı Olaylar arabirimini uygular ve ayrıca OnClickEventListener ve OnLongClickEventListener adlı iki iç içe arabirim vardır
Bu iki arayüz, Düğme veya Onay Kutusu gibi Widget'tan türetilen UI bileşenlerinde meydana gelebilecek olayları dinlemekten sorumludur. Dolayısıyla, bu örneği Java Arayüzü kullanan önceki Geri Arama örneğiyle karşılaştırırsak, bu iki arabirim Geri Arama arabirimi olarak çalışır. Böylece daha yüksek seviye kodu (Here Activity) bu iki arayüzü uygular. Bir widget'ta her olay gerçekleştiğinde, daha yüksek düzey kodu (veya burada Etkinlik olan üst düzey kodda uygulanan bu arabirimlerin yöntemi) çağrılır.
Şimdi Callback ve Eventlistener kalıbı arasındaki temel farkı tartışalım. Daha önce de belirttiğimiz gibi, Callee sadece bir Arayanı bilgilendirebilir. Ancak EventListener örneği söz konusu olduğunda, Uygulamanın herhangi bir kısmı veya sınıfı Düğme veya Onay Kutusunda meydana gelebilecek olaylara kaydolabilir. Bu tür bir sınıf örneği OtherClass'tır. OtherClass kodunu görürseniz, etkinlikte tanımlanan Düğmede oluşabilecek ClickEvent öğesini dinleyici olarak kaydettiğini görürsünüz. İlginç olan kısım, Etkinliğin (Arayan) yanı sıra, Düğme üzerinde tıklama olayı gerçekleştiğinde bu Diğer Sınıfın da bilgilendirilmesidir.
Geri arama işlevi, belirli bir işleve veya nesneye ilettiğiniz (başvuru veya işaretçi olarak) bir işlevdir. Bu işlev veya nesne, bu işlevi herhangi bir zamanda, muhtemelen birden çok kez, herhangi bir amaç için geri çağırır:
...
Bu nedenle, geri aramayı başka bir işlevin veya görevin sonunda çağrılan bir işlev olarak tanımlamak aşırı derecede basitleştiricidir (yaygın bir kullanım durumu olsa bile).
Geri arama, bir işlevi bir parametre olarak başka bir işleve geçirme fikridir ve işlem tamamlandığında bu işlevin çağrılmasını sağlar.
Geri arama kavramını yukarıdaki harika cevaplarla alırsanız, fikrinin arka planını öğrenmenizi öneririz.
"Onları (Bilgisayar-Bilimciler) geri arama geliştirmeye iten nedir?" Engellenen bir sorun öğrenebilirsiniz. (Özellikle kullanıcı arayüzünü engelleme) Ve geri çağrı bunun tek çözümü değildir. Birçok başka çözüm var (ör: Thread, Futures, Promises ...).
Önemli kullanım alanlarından biri, işlevinizden birini tanıtıcı (yani geri arama) olarak kaydetmeniz ve ardından bir iş veya işlem yapmak için bir ileti göndermeniz / bazı işlevleri çağırmanızdır. İşlem tamamlandıktan sonra, çağrılan fonksiyon kayıtlı fonksiyonumuzu arayacaktır (yani şimdi geri arama yapılıyor), böylece işlemin yapıldığını gösterir.
Bu wikipedia bağlantısı grafik olarak oldukça iyi açıklıyor.
Üst düzey işlev olarak da bilinen geri çağrı işlevi, başka bir işleve parametre olarak iletilen bir işlevdir ve geri çağırma işlevi üst işlev içinde çağrılır (veya yürütülür).
$("#button_1").click(function() {
alert("button 1 Clicked");
});
Burada, click yöntemine parametre olarak bir işlev aktarıyoruz. Ve click yöntemi, kendisine ilettiğimiz geri çağırma işlevini çağırır (veya yürütür).
Geri Arama İşlevi Bağımsız değişken olarak başka bir işleve iletilen işlev.
function test_function(){
alert("Hello world");
}
setTimeout(test_function, 2000);
Not: Yukarıdaki örnekte, setTimeout işlevi için bağımsız değişken olarak test_function kullanılmıştır.