function javascript 동기 - 일반 영어로 콜백을 설명하는 방법? 다른 함수에서 하나의 함수를 호출하는 것과 다른 점은 무엇입니까?





15 Answers

나는이 죽은자를 간단하게 지키려고 노력할 것이다. "콜백"은 첫 번째 함수를 매개 변수로 사용하는 다른 함수에 의해 호출되는 함수입니다. 많은 경우, "콜백"은 무언가 가 발생할 때 호출되는 함수입니다. 프로그래머가 말하면 "이벤트"라고 할 수 있습니다.

이 시나리오를 생각해보십시오. 며칠 후에 패키지를 기대하고 있습니다. 패키지는 이웃 사람에게 선물입니다. 따라서 일단 패키지를 얻으면 이웃에게 가져 오기를 원합니다. 너는 마을을 벗어 났고, 그래서 너는 배우자를위한 지시를 남긴다.

패키지를 가져 가서 이웃 사람들에게 가져 오라고 말할 수 있습니다. 배우자가 컴퓨터처럼 어리석은 사람이라면 그들은 문 앞에 앉아서 패키지가 올 때까지 기다릴 것입니다. (아무런 일도하지 않아야합니다.) 그리고 나서 한 번 그들은 이웃에게 그것을 가져다 줄 것입니다. 그러나 더 좋은 방법이 있습니다. 귀하의 배우자에게 그들이 패키지를 한 번 받고 이웃 사람들에게 가져와야한다고 말하십시오. 그런 다음 패키지를받을 때까지 정상적으로 생활 할 수 있습니다.

이 예에서 패키지 수신은 "이벤트"이며이를 이웃에게 가져 오는 것은 "콜백"입니다. 귀하의 배우자는 패키지가 도착할 때만 패키지를 가져 오는 지침을 "실행"합니다. 훨씬 낫다!

이런 종류의 사고는 일상 생활에서는 분명하지만 컴퓨터에는 같은 종류의 상식이 없습니다. 프로그래머가 파일에 일반적으로 쓰는 방법을 고려하십시오.

fileObject = open(file)
# now that we have WAITED for the file to open, we can write to it
fileObject.write("We are writing to the file.")
# now we can continue doing the other, totally unrelated things our program does

여기서 우리는 파일을 쓰기 전에 파일을 열어 기다립니다. 이렇게하면 실행 흐름이 "차단"되고 프로그램에서 수행해야 할 다른 작업을 수행 할 수 없습니다! 대신이 작업을 수행 할 수 있다면 어떨까요?

# we pass writeToFile (A CALLBACK FUNCTION!) to the open function
fileObject = open(file, writeToFile)
# execution continues flowing -- we don't wait for the file to be opened
# ONCE the file is opened we write to it, but while we wait WE CAN DO OTHER THINGS!

우리는 몇 가지 언어와 프레임 워크로이 작업을 수행합니다. 그것은 꽤 멋지다! 이런 종류의 사고로 실제 연습을하려면 Node.js 를 확인하십시오.

비동기를 동기로 자바스크립트

일반 영어로 콜백을 설명하는 방법? 호출 함수에서 일부 컨텍스트를 취하는 다른 함수에서 하나의 함수를 호출하는 것과 다른 점은 무엇입니까? 초능력 프로그래머에게 어떻게 그들의 힘을 설명 할 수 있습니까?




나는 너무 많은 지적인 사람들이 "콜백"이라는 단어가 두 가지 모순 된 방식으로 사용되었다는 사실을 강조하지 못하는 것을보고 깜짝 놀랐다.

두 가지 방법 모두 추가 기능 (익명 또는 명명 된 함수 정의)을 기존 함수에 전달하여 함수를 사용자 정의하는 작업입니다. 즉.

customizableFunc(customFunctionality)

사용자 정의 기능을 코드 블록에 간단하게 꽂으면 기능을 사용자 정의 할 수 있습니다.

    customizableFucn(customFunctionality) {
      var data = doSomthing();
      customFunctionality(data);
      ...
    }

이런 종류의 주입 기능이 종종 "콜백 (callback)"이라고 불리지 만, 그에 대한 우연한 것은 없습니다. 가장 명백한 예는 배열을 수정하기 위해 배열의 각 요소에 적용 할 인수로 사용자 지정 함수를 제공하는 forEach 메서드입니다.

그러나 이것은 AJAX 나 node.js와 같은 비동기 프로그래밍을 위한 "콜백 (callback)"기능을 사용하거나 단순히 마우스 클릭과 같은 사용자 상호 작용 이벤트에 기능을 할당하는 것과는 근본적으로 다릅니다. 이 경우 전체적인 아이디어는 사용자 지정 기능을 실행하기 전에 우발적 인 이벤트가 발생할 때까지 기다리는 것입니다. 이것은 사용자 상호 작용의 경우 분명하지만 디스크에서 파일을 읽는 것처럼 시간이 걸릴 수있는 I / O (입력 / 출력) 프로세스에서도 중요합니다. 여기서 "콜백"이라는 용어가 가장 분명한 의미를 갖습니다. 일단 I / O 프로세스가 시작되면 ( 비동기식 프로그램은 파일을 디스크 나 서버에서 읽어 와서 http 요청으로부터 데이터를 반환하도록 요구하는 것처럼) 비동기식 프로그램은 끝내기 위해 기다리지 않습니다. 다음에 예약 된 작업을 진행하고, 읽기 파일 또는 http 요청이 완료되었다는 (또는 실패한) 통보를 받고 사용자 지정 기능에서 데이터를 사용할 수있는 경우에만 사용자 지정 기능으로 응답 할 수 있습니다. 그것은 전화로 비즈니스를 호출하고 "콜백"번호를 남겨 두는 것과 같습니다. 따라서 누군가가 다시 연락 할 수있을 때 전화를 걸 수 있습니다. 얼마나 오랫동안 알고 있고 다른 업무에 참석할 수없는 사람들을위한 전화에 매달리는 것보다 낫습니다.

비동기 적 사용은 본질적으로 원하는 이벤트 (예 : I / O 프로세스의 완료)를 청취하는 수단을 필요로하므로 사용자 정의 콜백 기능이 실행될 때만 발생합니다. 분명한 AJAX 예제에서 데이터가 실제로 서버에서 도착하면 "콜백"함수가 트리거되어 해당 데이터를 사용하여 DOM을 수정하고 따라서 해당 범위까지 브라우저 창을 다시 그립니다.

요약하자면. 어떤 사람들은 "콜백 (callback)"이라는 단어를 사용하여 기존 기능에 인수로 주입 할 수있는 모든 종류의 사용자 지정 기능을 나타냅니다. 하지만 최소한 저에게 단어를 가장 적절히 사용하는 것은 주입 된 "콜백"기능이 비동기 적으로 사용되는 곳입니다. 통보 대기중인 이벤트가 발생할 때만 실행됩니다.




프로그래머가 스테이플러를 필요로하기 때문에 사무용품 공급 부서로 가서 요청 양식을 작성한 후 사무소에 서서 사무원이 스테이플러의 창고를 둘러 볼 때까지 기다릴 수 있습니다 (예 : 블로킹 기능 호출 ) 아니면 다른 일을하십시오.

일반적으로 시간이 걸리므로 조이는 요청 양식과 함께 스테이플러가 픽업 준비가되면 전화를 요구하는 메모를 남기므로 책상 위에 낮잠을자는 것과 같은 다른 일을 할 수 있습니다.




함수를 작성하기 위해 10 제곱을 반환하는 함수가 필요하다고 상상해보십시오.

function tenSquared() {return 10*10;}

나중에 다른 함수를 작성할 수 있도록 9 제곱이 필요합니다.

function nineSquared() {return 9*9;}

결국이 모든 것을 일반 함수로 바꿉니다.

function square(x) {return x*x;}

콜백에도 똑같은 생각이 적용됩니다. 당신은 무언가를하고 doA를 호출 할 수있는 함수를 가지고 있습니다 :

function computeA(){
    ...
    doA(result);
}

나중에 똑같은 함수가 doB를 호출하기를 원한다. 대신에 전체 함수를 복사 할 수있다.

function computeB(){
    ...
    doB(result);
}

또는 콜백 함수를 변수로 전달할 수 있으며 함수를 한 번만 가져야합니다.

function compute(callback){
    ...
    callback(result);
}

그런 다음 compute (doA) 및 compute (doB)를 호출하면됩니다.

코드 단순화 이외에도 비동기 코드를 사용하면 완료되면 임의의 함수를 호출하여 완료되었음을 알 수 있습니다. 전화에서 다른 사람에게 전화를 걸고 콜백 번호를 남길 때와 비슷합니다.




설명 할 두 가지 점이 있습니다. 하나는 콜백이 작동하는 방법 (컨텍스트에 대한 지식 없이도 호출 할 수있는 함수를 전달하는 방법)이고 다른 하나는 이벤트를 비동기 적으로 처리하는 방법입니다.

소포가 도착할 때까지 기다리는 비유는 다른 대답에 사용되었습니다. 둘 다 설명하는 것이 좋습니다. 컴퓨터 프로그램에서 소포를 기대하도록 컴퓨터에 지시합니다. 보통, 그것은 도착할 때까지 소포가 도착할 때까지 지금 거기 앉아서 기다릴 것입니다 (그리고 아무 것도하지 않습니다). 인간에게는 이것은 어리석은 것처럼 들리지만, 더 이상의 조치가 없으면 이것은 컴퓨터에 전적으로 자연스러운 일입니다.

이제 콜백은 현관 문에 종이 될 것입니다. 귀하는 소포 서비스를 제공하여 소포 도착 사실을 통보 할 수 있습니다. 소지자가 집에 어디에 있더라도 (또는 심지어 종소리가 어떻게 작동하는지) 알 필요도 없습니다. (예를 들어, 일부 "종"은 실제로 전화를 겁니다.) 언제든지 컨텍스트에서 "호출"할 수있는 "콜백 기능"을 제공 했으므로 이제 현관에 앉아서 멈출 수 있습니다. 이벤트 "(소포 도착) 시간이 될 때마다.




실행할 코드가 있습니다. 일반적으로 앱을 호출 할 때 앱을 계속하기 전에 끝내기를 기다리고 있습니다 (이로 인해 앱이 회색으로 바뀌거나 커서가 돌아갈 수 있습니다).

다른 방법은이 코드를 병렬로 실행하고 자신의 작업을 수행하는 것입니다. 하지만 원래 코드가 호출 한 코드의 응답에 따라 다른 작업을 수행해야하는 경우 어떻게해야할까요? 글쎄,이 경우 당신은 그것이 끝나면 당신이 전화를 원하는 코드의 이름 / 위치를 전달할 수 있습니다. 이것은 "콜백"입니다.

일반 코드 : 정보 요청 -> 프로세스 정보 -> 처리 결과 처리 -> 계속해서 다른 작업을 수행하십시오.

콜백 : 정보 요청 -> 프로세스 정보 -> 다른 일을 계속하십시오. 그리고 나중에 어떤 점에서 - 처리 결과를 다루십시오.




당신이 나에게 장기간에 걸친 작업을 해 줄 것이라고 가정 해 봅시다 : 당신이 만나는 처음 다섯 명의 독특한 사람들의 이름을 얻으십시오. 인구 밀도가 낮은 지역에 거주하는 경우 며칠이 걸릴 수 있습니다. 내가 뛰어 다니는 동안 당신은 손에 앉아서 정말로 관심이 없습니다. "목록을 얻었 으면 나를 전화해서 내게 다시 읽어주세요. 여기 숫자가 있습니다."

당신은 나에게 콜백 참조를주었습니다. 콜백 참조 (callback reference)는 추가 처리를 넘겨주기 위해 실행해야하는 함수입니다.

JavaScript에서는 다음과 같이 보일 수 있습니다.

var lottoNumbers = [];
var callback = function(theNames) {
  for (var i=0; i<theNames.length; i++) {
    lottoNumbers.push(theNames[i].length);
  }
};

db.executeQuery("SELECT name " +
                "FROM tblEveryOneInTheWholeWorld " +
                "ORDER BY proximity DESC " +
                "LIMIT 5", callback);

while (lottoNumbers.length < 5) {
  playGolf();
}
playLotto(lottoNumbers);

이것은 아마도 많은면에서 개선 될 수 있습니다. 예를 들어 두 번째 콜백을 제공 할 수 있습니다. 한 시간 이상 걸릴 경우 빨간색 전화를 걸어 시간 초과 결과를 응답자에게 알려줍니다.




콜백 함수는 두 번째 함수에 의해 호출 될 함수입니다. 이 두 번째 함수는 호출 할 함수를 미리 알지 못합니다. 따라서 콜백 함수의 ID 는 어딘가에 저장되거나 매개 변수로 두 번째 함수에 전달됩니다. 이 "신원"은 프로그래밍 언어에 따라 콜백 주소 나 다른 종류의 포인터 일 수도 있고 함수 이름 일 수도 있습니다. 주체는 동일하며 기능을 모호하지 않게 식별하는 정보를 저장하거나 전달합니다.

시간이 오면 두 번째 함수는 콜백을 호출하여 그 순간 상황에 따라 매개 변수를 제공 할 수 있습니다. 가능한 콜백 세트에서 콜백을 선택할 수도 있습니다. 프로그래밍 언어는 두 번째 함수가 콜백을 호출하여 "ID"를 알 수 있도록하는 일종의 구문을 제공해야합니다.

이 메커니즘은 가능한 많은 용도를 가지고 있습니다. 콜백을 사용하면 함수의 설계자는 제공되는 콜백을 호출하여 사용자 정의 할 수 있습니다. 예를 들어 정렬 함수는 콜백을 매개 변수로 사용할 수 있으며이 콜백은 두 요소를 비교하여 어느 것이 먼저 오는지를 결정하는 함수입니다.

그런데, 프로그래밍 언어에 따라 위의 논의에서 "함수"라는 단어는 "블록", "폐쇄", "람다"등으로 대체 될 수 있습니다.




은유 적 설명 :

나는 친구에게 배달되기를 원하는 소포를 가지고 있으며, 내 친구가 그것을 언제 받는지 알고 싶다.

그래서 나는 소포를 우체국에 가져 가서 배달하도록 요청합니다. 친구가 소포를받을 때를 알고 싶다면 두 가지 옵션이 있습니다.

(a) 배달 될 때까지 우체국에서 기다릴 수 있습니다.

(b) 배달 될 때 나는 이메일을받을 것이다.

옵션 (b)는 콜백과 유사합니다.




일반 영어에서는 콜백이 약속입니다. Joe, Jane, David와 Samantha는 카풀을 공유하여 일합니다. 조가 오늘 운전하고있어. Jane, David 및 Samantha에게는 몇 가지 옵션이 있습니다.

  1. 조가 빠져 있는지 5 분마다 확인
  2. Joe가 문 종을 울릴 때까지 계속 일을하십시오.

옵션 1 : Joe가 외부에 있는지 Jane이 "루프"확인에 걸리는 폴링 예제와 비슷합니다. Jane은 그 동안 다른 것을 할 수 없습니다.

옵션 2 : 이것은 콜백 예제입니다. Jane은 Joe에게 밖에있을 때 초인종을 울리라고합니다. 그녀는 그에게 문 종을 울리는 "기능"을줍니다. Joe는 도어 벨이 작동하는 방식이나 위치를 알 필요가 없으며, 그 기능을 호출해야합니다. 즉, 그가있을 때 도어 벨을 울리면됩니다.

콜백은 "이벤트"에 의해 구동됩니다. 이 예에서 "이벤트"는 조의 도착입니다. 예를 들어 Ajax에서 이벤트는 비동기 요청의 "성공"또는 "실패"일 수 있으며 각 이벤트는 동일하거나 다른 콜백을 가질 수 있습니다.

자바 스크립트 애플리케이션 및 콜백 측면에서. 우리는 또한 "클로저"와 애플리케이션 컨텍스트를 이해할 필요가 있습니다. "this"가 가리키는 것은 JavaScript 개발자를 쉽게 혼란시킬 수 있습니다. 이 예에서는 각 사람의 "ring_the_door_bell ()"메소드 / 콜백 내에 아침 루틴을 기준으로 각 사람이해야 할 다른 방법이있을 수 있습니다. "turn_off_the_tv ()". "this"가 "Jane"객체 또는 "David"객체를 참조하여 Joe가 선택하기 전에 필요한 다른 작업을 각각 설정할 수 있도록하는 것이 좋습니다. Joe와 콜백을 설정하려면 메소드를 패러디하여 "this"가 올바른 객체를 참조하도록해야합니다.

희망이 도움이됩니다!




설명하기가 다소 쉬운 일이라고 생각합니다.

첫 번째 콜백은 보통 함수입니다.
더 나아가, 우리는이 함수를 (다른 함수 내부에서) A라고 부르겠습니다.

이것에 대해 마법은 내가 결정하는 것입니다 어떤 에서 함수를 호출해야 기능을 외부 B.

당시에 BI 함수를 작성하면 어떤 콜백 함수를 호출해야하는지 알 수 없습니다. 내가 함수 BI를 호출 할 때 함수 A를 호출하도록이 함수에 지시하십시오.




콜백은 조건이 충족 될 때 실행되도록 예약 된 메서드입니다.

"실제"예는 지역 비디오 게임 상점입니다. Half-Life 3을 기다리고 있습니다. 매일 매장에 가서 게임을 볼 수있는 목록 대신 전자 메일을 등록하여 게임을 사용할 수있을 때 알려줍니다. 전자 메일은 "콜백"이되고 충족해야 할 조건은 게임의 가용성입니다.

"프로그래머"예제는 단추를 클릭 할 때 작업을 수행하려는 웹 페이지입니다. 단추에 대한 콜백 메서드를 등록하고 다른 작업을 계속 수행합니다. 사용자가 버튼을 클릭하면 브라우저는 해당 이벤트의 콜백 목록을보고 메소드를 호출합니다.

콜백은 이벤트를 비동기 적으로 처리하는 방법입니다. 콜백이 언제 실행되는지, 또는 콜백이 전혀 실행되는지 알 수 없습니다. 이점은 회신을 기다리는 동안 다른 작업을 수행하기 위해 프로그램과 CPU주기를 자유롭게 해줍니다.




"컴퓨터 프로그래밍에서 콜백은 다른 코드에 인수로 전달되는 실행 가능한 코드 또는 실행 가능한 코드에 대한 참조입니다. 이것은 하위 레벨 소프트웨어 레이어가 상위 레벨 레이어에 정의 된 서브 루틴 (또는 함수)을 호출 할 수있게합니다. "- Wikipedia

함수 포인터를 사용하여 C에서 콜백

C에서는 콜백 함수 포인터를 사용하여 구현됩니다. 함수 포인터 - 이름에서 알 수 있듯이 함수에 대한 포인터입니다.

예를 들어, int (* ptrFunc) ();

여기서 ptrFunc는 인수를 취하지 않고 정수를 반환하는 함수에 대한 포인터입니다. 괄호를 넣는 것을 잊지 마십시오. 그렇지 않으면 컴파일러는 ptrFunc가 아무 것도 취하지 않고 정수에 대한 포인터를 반환하는 일반 함수 이름이라고 가정합니다.

다음은 함수 포인터를 보여주는 코드입니다.

#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;
}

이제 우리는 함수 포인터를 사용하여 C에서 콜백 개념을 이해하려고 노력합니다.

전체 프로그램에는 callback.c, reg_callback.h 및 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)();                               
}

이 프로그램을 실행하면 출력은

이것은 주 프로그램 내에서 my_callback 내부의 register_callback 내부에서 함수 콜백을 시연하는 프로그램입니다.

상위 계층 함수는 하위 계층 함수를 일반 호출로 호출하고 콜백 메커니즘은 하위 계층 함수가 콜백 함수에 대한 포인터를 통해 상위 계층 함수를 호출하도록 허용합니다.

인터페이스를 사용한 Java의 콜백

Java는 함수 포인터 개념을 가지고 있지 않습니다. 인터페이스 메커니즘을 통해 콜백 메커니즘을 구현합니다. 여기서는 함수 포인터 대신 호출 수신자가 작업을 완료 할 때 호출 될 메소드가있는 인터페이스를 선언합니다

예를 통해 설명해 드리겠습니다.

콜백 인터페이스

public interface Callback
{
    public void notify(Result result);
}

호출자 또는 상위 레벨 클래스

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

피 호출자 또는 하위 계층 기능

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 패턴을 사용하는 콜백

  • 목록 항목

이 패턴은 특정 작업이 완료된 관찰자 / 수신기의 수를 0에서 n까지 알리는 데 사용됩니다

  • 목록 항목

콜백 메커니즘과 EventListener / Observer 메커니즘의 차이점은 콜백에서 호출 수신자가 단일 호출자에게 알리는 반면 Eventlisener / Observer에서 호출 수신자는 해당 이벤트에 관심이있는 모든 사용자에게 알릴 수 있다는 것입니다. 알림은 해당 호출의 다른 부분으로 이동할 수 있습니다. 작업을 트리거하지 않은 응용 프로그램)

예를 통해 설명하겠습니다.

이벤트 인터페이스

public interface Events {

public void clickEvent();
public void longClickEvent();
}

클래스 위젯

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

클래스 버튼

public class Button extends Widget{
private String mButtonText;
public Button (){
} 
public String getButtonText() {
return mButtonText;
}
public void setButtonText(String buttonText) {
this.mButtonText = buttonText;
}
}

클래스 체크 박스

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

활동 클래스

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

기타 수업

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

메인 클래스

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

위의 코드에서 알 수 있듯이 기본적으로 응용 프로그램에서 발생할 수있는 모든 이벤트를 나열하는 이벤트라는 인터페이스가 있습니다. Widget 클래스는 Button, Checkbox와 같은 모든 UI 구성 요소의 기본 클래스입니다. 이러한 UI 구성 요소는 실제로 프레임 워크 코드에서 이벤트를 수신하는 객체입니다. 위젯 클래스는 Events 인터페이스를 구현하며 OnClickEventListener 및 OnLongClickEventListener라는 두 개의 중첩 인터페이스도 제공합니다.

이 두 인터페이스는 Button이나 Checkbox와 같은 위젯 파생 UI 구성 요소에서 발생할 수있는 이벤트를 수신합니다. 따라서이 예를 Java Interface를 사용하는 이전 Callback 예제와 비교하면이 두 인터페이스가 Callback 인터페이스로 작동합니다. 따라서 상위 레벨 코드 (Here Activity)는이 두 인터페이스를 구현합니다. 이벤트가 위젯에 발생할 때마다 상위 레벨 코드 (또는 상위 레벨 코드에 구현 된이 인터페이스의 메소드, 여기서는 Activity)가 호출됩니다.

이제 Callback과 EventListener 패턴의 기본적인 차이점을 설명하겠습니다. Callback을 사용한다고 언급했듯이, Callee는 한 명의 발신자에게만 알릴 수 있습니다. 그러나 EventListener 패턴의 경우 응용 프로그램의 다른 부분이나 클래스가 Button이나 Checkbox에서 발생할 수있는 이벤트를 등록 할 수 있습니다. 이런 종류의 클래스의 예는 OtherClass입니다. OtherClass의 코드를 보면, Activity에 정의 된 Button에서 발생할 수있는 ClickEvent에 대한 리스너로 자신을 등록한 것을 알 수 있습니다. 재미있는 부분은 Activity (호출자) 외에도 Button에서 click 이벤트가 발생할 때마다이 OtherClass에 알림이 전송된다는 것입니다.




동료에게 작업을 제공하는 방법을 생각해보십시오. 간단한 작업은 다음과 같습니다.

Solve these equations:
x + 2 = y
2 * x = 3 * y

동료가 수학을 부지런히 수행하고 다음 결과를 제공합니다.

x = -6
y = -4

그러나 동료는 문제가 있습니다. 항상 같은 표기법을 이해하지는 않지만 ^설명으로 이해합니다. 예를 들면 exponent. 매번 그가 다음 중 하나를 찾으면 다음과 같은 결과를 얻습니다.

I don't understand "^"

이것은 문자가 동료에게 무엇을 의미하는지 설명 한 후에 전체 명령 세트를 다시 작성해야하며, 질문 사이에 항상 기억하지는 않습니다. 그리고 그는 나에게 부탁하는 등 팁을 기억하는 데 어려움이 있습니다. 그는 항상 최선을 다해 서면 지침을 따르고 있습니다.

해결책을 생각하면 모든 지침에 다음을 추가하기 만하면됩니다.

If you have any questions about symbols, call me at extension 1234 and I will tell you its name.

이제 문제가 생길 때마다 그는 당신에게 부탁하고 부탁합니다. 당신에게 나쁜 반응을주고 프로세스를 다시 시작합니다.




웹 페이지를 다운로드하는 측면에서 보면 다음과 같습니다.

귀하의 프로그램은 휴대 전화에서 실행되며 http://www.google.com 웹 페이지를 요청하고 있습니다. 프로그램을 동 기적으로 작성하면 모든 데이터가 다운로드 될 때까지 데이터를 다운로드하기 위해 작성한 기능이 계속 실행됩니다. 즉, UI가 새로 고침되지 않고 기본적으로 고정 된 것처럼 보입니다. 콜백을 사용하여 프로그램을 작성하는 경우 데이터를 요청하고 "완료하면이 함수를 실행하십시오."라고 말합니다. 이렇게하면 파일을 다운로드하는 동안 UI가 사용자 상호 작용을 계속 허용합니다. 웹 페이지의 다운로드가 끝나면 결과 함수 (콜백)가 호출되고 데이터를 처리 할 수 ​​있습니다.

기본적으로, 결과를 기다리는 동안 무언가를 요청하고 실행을 계속할 수 있습니다. 콜백 함수를 통해 결과가 반환되면 중단 된 위치에서 작업을 다시 시작할 수 있습니다.




Related