콜백은 Wikipedia에서 다음과 같이 정의됩니다.
컴퓨터 프로그래밍에서 콜백 함수는 기능 매개 변수를 통해 다른 코드로 전달되는 특정 실행 가능한 코드에 대한 참조를 나타냅니다.
목적은 기본 코드가 더 높은 수준에서 정의 된 서브 루틴을 호출하도록하는 것입니다.
예를 들어, 더 명확 할 수 있습니다. 예를 들어 Android의 네트워크 요청에 대한 개조를 사용하면 비동기 콜백의 예입니다.
네트워크 요청을 시작한 후 앱은 다른 것들을 계속할 수 있습니다. 네트워크 요청의 결과는 일반적으로 onresponse와 onfailure의 두 가지 방법을 통해 얻습니다. 관련 부분의 코드를 살펴보십시오.
Call.Enqueue (new Callback <cististryBean> () {@override public void onresponse (Call <cistoryBean> Call, Response <ChistoryBean> Response) {historbean hb = response.body (); if (hb == null) return; showtext.append (hb.iserror () + ""); hbbean rb : hb.getresbean rb. showtext.append (rb.getTitle () + "/n")} @override public void onfailure (historybean> call, trashable t) {}});위의 콜백의 제네릭을 무시하십시오. Wikipedia의 정의에 따르면 익명 내부 클래스의 모든 코드 는 다른 코드로 전달되는 특정 실행 가능한 코드에 대한 참조로 간주 될 수 있습니다. onresponse와 onfailure의 두 가지 방법은 콜백 메소드입니다. 기본 코드는 작성된 변경되지 않은 네트워크 요청 부분이며, 더 높은 레벨로 정의 된 서브 루틴은 콜백입니다. 특정 구현은 사용자에게 전달되므로 유연성이 높습니다. 위는 메소드 eNqueue (콜백 콜백)를 통해 관련됩니다.
콜백 방법의 단계
위에서 언급 한 콜백은 매우 일반적인 개념입니다. 프로그램 작성에 넣으면 다음과 같이 말할 수 있습니다.
클래스 A에서 클래스 B의 메소드 C가 호출되고 클래스 B에서 클래스 A의 메소드 D가 리버스로 호출됩니다. D는 콜백 메소드입니다. 클래스 B는 기본 코드이며 클래스 A는 높은 수준의 코드입니다.
따라서 위의 설명을 통해 우리는 무언가를 추론 할 수 있습니다. 방법 d의 범용을 나타내려면 인터페이스 양식을 사용하여 메소드 D를 인터페이스 메소드라고합니다. 클래스 B가 클래스 A에서 메소드 D를 호출하려면 클래스 A 가이 인터페이스를 구현해야합니다. 이러한 방식으로 구현에 따라 다형성이있어서 방법을 유연하게 만듭니다.
클래스 A가 클래스 B에서 메소드 C를 호출하려는 경우 클래스 A에는 B에 대한 참조가 포함되어 있어야합니다. 그렇지 않으면 호출되지 않습니다. 이 단계를 등록 콜백 인터페이스라고합니다. 따라서 클래스 B의 클래스 A에서 리버스 호출 방법 D를 구현하는 방법, 클래스 B의 위 메소드 C 메소드 C를 통해 직접 인터페이스 유형 매개 변수를 수용합니다. 그런 다음 메소드 C에서만 클래스 B에서 메소드 D를 호출하기 위해이 인터페이스 유형의 매개 변수를 사용해야합니다.
또한 클래스 B의 C 메소드에서 클래스 A의 D 메소드는 콜백 인 리버스로 호출되어야한다는 것을 구현합니다. 직접 조정하는 통화 B, 고급 코드에 기본 API를 사용하는 것으로 간주 될 수 있습니다. 우리는 종종 이와 같은 프로그램을 작성합니다. B는 A를 호출하여 전화를 걸고 기본 API는 고급 코드를 실행해야합니다.
마지막으로 콜백 메소드의 단계를 요약하겠습니다.
콜백 예제
아들이 게임을하고 어머니가 식사를 준비하고 아들에게 예를 들어 와서 먹을 것을 알리고 위의 단계를 따르기 위해 콜백을 작성하자.
위의 예에서는 아들이 콜백 인터페이스를 구현해야하며 어머니는 콜백 인터페이스를 호출해야한다는 것이 분명합니다. 따라서 먼저 콜백 인터페이스를 정의한 다음 아들 이이 콜백 인터페이스를 구현하도록합니다.
코드는 다음과 같습니다.
공개 인터페이스 콜백 {void eat ();} 공개 계급 아들은 콜백을 구현합니다. {개인 엄마 엄마; // 클래스 A는 클래스 B 공개 void setMom (엄마)에 대한 참조를 보유합니다. {this.mom = mom; } @override public void eat () {system.out.println ( "식사를하기 위해 여기에 있습니다"); } public void askmom () {// 클래스 B를 참조하여 인터페이스 매개 변수로 메소드를 호출합니다. System.out.println ( "식사가 요리 되었습니까?"); System.out.println ( "완료되지 않아 게임을하고 있습니다"); 새 스레드 (() -> mom.docook (son.this)). start (); System.out.println ( "게임 재생 ..."); }}그런 다음 인터페이스 매개 변수가있는 메소드 문서를 포함하는 어머니의 수업도 정의해야합니다.
공공 클래스 엄마 {// 인터페이스 매개 변수가 포함 된 메소드에서 인터페이스 매개 변수를 사용하여 콜백 메소드를 호출 공개 void docook (콜백 콜백) {new 스레드 (new Runnable () {@override public void run () {try {system.out.println ( "Cooking ..."); Thread.sleep (5000); Catch (interruptedecemente (); e.printstacktrace (); start (); }}테스트 클래스를 통과합니다.
공개 클래스 테스트 {public static void main (String [] args) {엄마 mom = new Mom (); 아들 아들 = 새로운 아들 (); Son.setmom (엄마); Son.askmom (); }}이 예제는 일반적인 콜백 예입니다. 아들 클래스는 인터페이스의 콜백 메소드를 구현합니다. AskMom 메소드를 통해 엄마 클래스에서 Docook을 호출하여 콜백 인터페이스를 등록합니다. 이는 A. 클래스 A에서 클래스 B 코드 C를 호출하는 것과 같습니다. 엄마 클래스의 Docook은 아들 클래스에서 Eat를 호출하여 아들 클래스에서 결과를 알려줍니다.
이런 식으로 간단하고 정의 된 콜백을 구현합니다.
콜백 예제의 추가 탐색
주로 아들 클래스의 코드를 살펴 보겠습니다.
공개 계급 아들은 콜백을 구현합니다. {public mom mom; 공개 아들 (엄마) {this.mom = 엄마; } public void askmom () {system.out.println ( "식사가 요리 되었습니까?"); System.out.println ( "나는 잘하지 않았고 게임을했다"); 새 스레드 (() -> mom.docook (son.this)). start (); System.out.println ( "게임을하고 있습니다 ..."); } @override public void eat () {system.out.println ( "좋아요, 식사를하기 위해 여기 있습니다"); }}이 수업에서 일부 진술을 출력하는 것 외에도 정말 유용한 부분은 Mom.Docook (Son.this) 및 Eat Method를 다시 작성합니다. 따라서 익명의 내부 클래스 형태를 통해이 콜백을 약화시킬 수 있습니다. 코드는 다음과 같습니다.
공개 클래스 CallbackTest {public static void main (String [] args) {mom mom = new Mom (); 새 스레드 (() -> mom.docook (() -> system.out.println ( "식사가 있었다 ..."))). 시작 (); }}아들 클래스를 취소하고 기본 메소드에서 익명의 내부 클래스를 통해 EAT 메소드를 직접 구현하십시오. 실제로 익명의 내부 클래스는 콜백의 구체화입니다.
비동기 콜백 및 동기식 콜백
콜백 : A 클래스 B의 호출 메소드 C, 그런 다음 메소드 C의 클래스 A 객체를 통해 클래스 A에서 메소드 D를 호출합니다.
비동기 및 동기화에 대해 이야기 해 봅시다. 먼저 동기화 개념에 대해 이야기합시다.
동기
동기화는 메소드를 호출 할 때 이전 메소드 호출이 실행되지 않으면 새 메소드 호출을 수행 할 수 없음을 의미합니다. 다시 말해, 일은 하나씩 수행해야하며, 다음을 수행 할 수 있습니다.
비동기
비동기식은 동기화와 관련이 있으므로 새 메소드를 호출하기 전에 이전 메소드 호출이 완료 될 때까지 기다릴 필요가 없습니다. 따라서 비동기 메소드 호출에서 메소드 호출 결과를 사용자에게 알리는 메소드가 필요합니다.
비동기 방법을 구현하십시오
Java에서 비동기식을 구현하는 가장 일반적인 방법은 새 스레드에서 비동기 적으로 실행하려는 메소드를 보장하는 것입니다.
사용자의 호출 결과에 알리기 위해 비동기 메소드 호출로 메소드가 필요하다는 것을 알 수 있습니다. 위의 내용을 기반으로 콜백 메소드가이를 수행하는 데 적합하고 콜백 메소드를 통해 호출 결과를 사용자에게 알립니다.
비동기 콜백은 A의 호출 메소드 C의 경우 새 스레드에서 수행됩니다.
아들에게 저녁 식사를 알리는 어머니의 위의 예는 비동기 콜백의 예입니다. 새 스레드에서 Docook 메소드가 호출되고 반환 값은 Eat를 통해 최종적으로 허용됩니다. 물론 Lamdba 최적화를 사용한 후에는 본질이 동일합니다.
동기 콜백은 A 호출 B 메소드 C가 새 스레드에 있지 않음을 의미합니다. 이 방법 C를 실행할 때는 아무것도 할 수 없으며 완료되기를 기다릴 수 있습니다.
동기식 콜백 및 비동기 콜백의 예
Android의 동기 콜백의 예를 살펴 보겠습니다.
button.setonClickListener (new View.onClickListener () {@override public void onclick (view v) {log.i ( "button", "clicked");}});버튼은 setonClickListener를 통해 콜백 함수를 등록하고 위에 작성된대로 익명의 내부 클래스 형태로 인터페이스의 참조를 전달합니다. 버튼은 새 스레드를 작성하지 않고 SetonClickListener를 호출하기 때문에 동기식 콜백입니다.
비동기 콜백은 처음에 우리가 이야기 한 예입니다.
Call.Enqueue (new Callback <cististryBean> () {@override public void onresponse (Call <cistoryBean> Call, Response <ChistoryBean> Response) {historbean hb = response.body (); if (hb == null) return; showtext.append (hb.iserror () + ""); hbbean rb : hb.getresbean rb. showtext.append (rb.getTitle () + "/n")} @override public void onfailure (historybean> call, trashable t) {}});이 Enqueue 방법은 원격 네트워크 데이터를 요청하는 비동기 방법입니다. 내부적으로 구현되면 새 스레드를 통해 실행됩니다.
이 두 가지 예를 통해 동기식 콜백과 비동기 콜백을 사용하는 것이 실제로 다른 요구에 따라 설계되었음을 알 수 있습니다. 하나는 다른 하나를 대체한다고 말할 수는 없습니다. 예를 들어, 위의 버튼 클릭 이벤트에서 비동기 콜백 인 경우 사용자가 버튼을 클릭 한 후 즉시 클릭 효과가 나타나지 않으면 사용자가 다른 작업을 수행하지 않으면 이상하게 느껴집니다. 네트워크 요청에 대한 비동기 콜백 - 요청 된 리소스가 존재하지 않을 수 있고, 네트워크 연결이 불안정하고, 다른 이유는 사용자는 메소드 실행에 대해 명확하지 않으므로 비동기 콜백을 사용하고 메소드 호출을 시작한 다음 콜백 알림을 기다릴 수 있습니다.
커뮤니케이션에서 콜백 방법의 적용
네트워크 요청 프레임 워크의 콜백을 제외하고 위에서 언급 한 콜백 메소드에는 모두 매개 변수가 없습니다. 콜백 메소드에 매개 변수를 추가하여 일부 커뮤니케이션 문제를 구현하십시오.
Class A가 일련의 계산 및 처리 후 클래스 B의 데이터를 얻기를 원한다면 두 클래스는 단순히 클래스 A의 데이터를 참조 할 수 없습니다. 우리는 콜백을 고려할 수 있습니다.
단계는 다음과 같습니다.
위에서 언급 한 단계는 약간 추상적입니다. 아래 예를 살펴 보겠습니다. 하나는 클라이언트이고 다른 하나는 서버입니다. 클라이언트는 서버의 시간이 소요되는 데이터를 요청합니다.
공개 클래스 클라이언트 {공개 서버 서버; 공개 문자열 요청; // 서버를 링크하고 서버 참조를 가져옵니다. public client connect (서버 서버) {this.server = server; 이것을 반환하십시오; } // 클라이언트, 요청 설정 공개 클라이언트 setRequest (문자열 요청) {this.request = request; 이것을 반환하십시오; } // 요청 메소드 인 Lamdba 표현식을 놀라게 보냅니다. public void enqueue (server.callback 콜백) {new Thread (()-> server.setCallback (request, callback)). start (); }} 공개 클래스 서버 {public String response = "이것은 HTML입니다"; // 콜백 인터페이스의 메소드를 등록하고 매개 변수를 통해 콜백 인터페이스에 데이터를 전달합니다. public void setCallback (문자열 요청, 콜백 콜백) {System.out.println ( "요청이 수신되었고 계산됩니다 ..."); 새 스레드 (() -> {try {strook.sleep (5000); Callback.onResponse (request + response);} catch (InterpruptedException e) {e.printstacktrace (); 콜백 .onfail (e);}}). start (); } // 데이터 공개 인터페이스 콜백을 소유 한 클래스에서 인터페이스를 작성합니다 {void onresponse (String response); void onfail (Throwable Throwable); }}다음으로 테스트 예를 살펴 보겠습니다.
공개 클래스 CallbackTest {public static void main (String [] args) {client client = new Client (); client.connect (new server ()). setRequest ( "이 파일은 무엇입니까?"). enqueue (new server.callback () {@override public void onresponse (string response) {system.out.println (응답);} @override public void onfail (Throwable Strash.out.println (systable.println)); }}결과는 다음과 같습니다.
요청이 접수되어 계산되고 있습니다 ...이 파일은 무엇입니까? 이것은 HTML입니다
위의 것은 콜백을 통해 의사 소통하는 것입니다.
위는이 기사의 모든 내용입니다. 이 기사의 내용이 모든 사람의 연구 나 업무에 도움이되기를 바랍니다. 또한 wulin.com을 더 지원하기를 바랍니다!