English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Android의 인터페이스 콜백 메커니즘을 깊이 이해하기

처음 배울 때에는 이 메커니즘에 대해 깊이 이해하지 못했어요. 지금은 생각을 다시 정리해보겠습니다. 개발 중에는, 인터페이스 콜백을 자주 사용합니다.

인터페이스 콜백의 의미는, 등록 후 즉시 실행되지 않고, 특정 시기에 트리거됨으로써 실행됩니다.

먼저 무엇이回调인지 해결해보겠습니다:

예를 들어: 어느 날, 저는 문제를 문의하기 위해 전화를 걸었어요. 물론 어려운 문제였고, 당신은 즉시 해결책을 생각해내지 못했어요. 저는 전화를 들고 그대로 기다릴 수 없었으니까, 우리는 이렇게 약속했습니다: 당신이 해결책을 생각해냈을 때 전화를 걸어 주세요. 그래서 저는 전화를 끊고 다른 일을 했습니다. XX분 후, 저의 핸드폰이 울렸고, 당신은 기쁘게 말했습니다. 문제가 해결되었고, 이렇게 처리해야 합니다.

 

C는 자기가 b를 호출하지 않으며, C가 제공하는 목적은 S가 그것을 호출하는 것이며, C는 제공해야 해요. S는 C가 제공하는 b가 무엇인지 모르지만, 그래서 S는 b의 인터페이스 규격(함수 원형)을 약정하고, C는 이전에 S의 함수 r를 통해 S에게 b 함수를 사용하려고 할 것이라고 알려줍니다(즉, 등록). r는 등록 함수입니다.

간단히 말해서: 콜백 함수는 시스템 호출을 위해 예약된 함수이며, 우리는 대개 함수가 호출될 시기를 알고 있어요. 그래서 그림을 더욱 완성해보겠습니다.

이 그림을 보며, 우리는 다시 생각해 보면, 생활 속에는 어디에나回调이 존재하는 것을 발견할 수 있습니다. 소프트웨어의 많은 아이디어는 실제 생활에서의 사고 방식의 변환일 뿐입니다.

우리가 일반적으로 시험에서 답안지를 쓸 때 첫 번째 일은 무엇인가요? 맞습니다, 학번과 이름을 씁니다. 여기 주의해야 할 것은, 우리가 학번과 이름을 쓰는 것은 자신에게 보기 위해서가 아니라(즉, 이 메서드는 자신을 호출하는 것이 아니라), 교사가 점수를 기록할 때 볼 것입니다(시스템이 미래에 호출할 예정입니다)이며, 이것이 바로回调의 응용입니다. 교사가 인터페이스를 제공하면(이름 입력, 학번 규칙), 우리는 인터페이스를 사용하여 등록합니다.

위의 작은 예제를 보고,回调에 대해 조금 더 이해하게 되었습니다. 그런 다음, 기사의 초반 예제로 돌아가 보겠습니다.

그 예제는 '비동기'를 설명합니다.+回调의 프로그래밍 패턴. 그 중에서 나중에 휴대폰을 통해 결과를 알려주는 것은 바로 '回调' 과정입니다; 나의 휴대폰 번호는 이전에 알려져야 하며, 이것은回调 함수 등록입니다; 나의 휴대폰 번호는 유효하며 휴대폰이 당신의 전화를 받을 수 있어야 합니다. 이는回调 함수가 인터페이스 규격을 준수해야 합니다.

우리는回调의 기본 프로세스를 약간 알고 있습니다. 그런 다음, android에서回调의 기본 사용법을 보겠습니다.

장면 1:

Button button = (Button)this.findViewById(R.id.button);  
button.setOnClickListener(new Button.OnClickListener() {  
  //回调 함수  
  @Override  
  public void onClick(View v) {  
   buttonTextView.setText("버튼이 클릭되었습니다");  
  }  
});  

위 코드는 버튼에 이벤트 리스너를 추가했습니다. 이것이 바로 '回调'이 가장 많이 사용되는 적용场景 중 하나입니다. 우리는 onClick 메서드를 명시적으로 호출하지 않습니다. 사용자가 버튼의 클릭 이벤트를 트리거하면, Android 시스템이 자동으로 호출합니다.

장면 2:

@Override  
public void onCreate(Bundle savedInstanceState) {  
  super.onCreate(saveInstanceState);  
  // 당신 코드...  
}  
@Override  
public void onResume() {  
  super.onResume();  
  // 당신 코드...  
}  

Activity의 전체 라이프사이클은 대체로回调 함수가 작용하고 있습니다.

우리가 자주 사용하는 두 가지回调 방식을 보고, 우리는 먼저 android에서回调을 사용하는 기본 방법을 요약해 보겠습니다. 사실, 우리의 그림을 번역한 것일 뿐입니다.

--당신의 클래스--

package lin.callback.test; 
public class You implements Runnable{}} 
  private String who; 
   private ContactInterface callBack;  
   public You() { 
      // TODO Auto-generated constructor stub 
   } 
  //이 메서드를 호출하면 누군가가 연락했습니다, 당신의 여기에 등록해 주세요 
   public void setCallBack(String who,String question,ContactInterface callBack) { 
     this.who = who;   
     System.out.println("당신이 연락받은 사람은"+who+"이렇게", "문제는"+question); 
     this.callBack =callBack; 
   } 
   public void handleThings(){ 
     //만약 지금 문제의 답을 생각하고 있으면, 조금의 시간이 필요합니다 
     for(int i=0;i<100000;i++){  
        if(i == 0){ 
          System.out.println("당신이 문제를 생각하고 있습니다....."); 
        } 
     } 
     String answer = "답은 A입니다"; 
     //문제에 답을 생각해 냈습니다 
     System.out.println("당신이 말했습니다: 답을 생각해 냈습니다, 그에게 전화를 걸 준비하고 있습니다"+who+"그에게 답변을 말해야 합니다"); 
     callBack.callBackByTel(answer); 
   } 
  /* (non-Javadoc) 
   * @see java.lang.Runnable#run() 
   */ 
  @Override 
  public void run() { 
    try { 
      Thread.sleep(1000); 
      handleThings(); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  }  
} 

--저의 클래스--

public class Me { 
   public static void main(String[] args){  
     Me me = new Me(); 
     me.hasQuestion(); 
   } 
   private void hasQuestion(){ 
     //지금 문제에 답을 생각不出来해서, 그때 그때 물어보고 싶어요 
     You you = new You(); 
     you.setCallBack("파룬", "어떤 문제의 답은 무엇인가요?", new ContactInterface() { 
      @Override 
      public void callBackByTel(String answer) { 
        System.out.println("저는 말합니다: 네, 좋습니다, 답변을 받았습니다:")+answer+"감사합니다"); 
      } 
    }); 
    //전화를 받고 일어나 문제를 생각하기 시작합니다 
    new Thread(you).start(); 
   } 
} 

--인터페이스 클래스(규격)--

public interface ContactInterface { 
  public void callBackByTel(String answer); 
} 

검증 결과:

당신은 말합니다: 현재 연락을 받은 사람은蜗牛이며, 문제의 답변은 무엇인가요?
당신이 문제를 생각하고 있습니다
당신은 말합니다: 문제를 생각해 보았습니다,蜗牛에게 답변을 전달하기 위해 전화를 걸 준비를 합니다
저는 말합니다: 네, 좋습니다, 답변을 받았습니다: 답변은 A입니다, 감사합니다

回调에 대한 깊은 고찰:

프로그램의 본질은 코드 점프입니다. 동기화 비동기 반영 인터페이스 가상 함수, 본질적으로 모두 함수 호출입니다. 함수를 호출하려면 그 포인터가 필요하며, 다른 언어는 다른 방식으로 포인터를 얻습니다. 우리가 정의한 인터페이스는 실제로는 함수 포인터입니다. 따라서 그 등록 과정은 실제로는 해당 함수 포인터에 값을 할당하는 것과 같습니다. 정의한 자체 구현 함수를 호출하기 위해 해당 함수 포인터를 통해 호출합니다.

이것이 이 문서의 전체 내용입니다. 여러분의 학습에 도움이 되길 바라며, 모두들 나레이션 교본을 많이 지지해 주시길 바랍니다.

고지사항: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권자가 모두 소유하고 있으며, 인터넷 사용자가 자발적으로 기여하고 자신의 파일을 업로드한 것입니다. 이 사이트는 소유권을 가지지 않으며, 인공 편집을하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 문제가 의심되는 내용이 있다면, notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com(메일을 보내는 경우 #을 @으로 변경하여 신고하시고, 관련 증거를 제공하시면, 사실이 확인되면 이 사이트는 즉시 의심스러운 저작권 내용을 삭제합니다。)

좋아하는 것