Android CallBack

don9wan·2021년 10월 13일
0

Android

목록 보기
11/18
post-thumbnail

저번 안드로이드 수명주기의 글에서 콜백이 자주 언급됐다. 안드로이드 수명주기는 6가지 콜백으로 이루어져있다고. 그리고 그 콜백은 onCreate(), onStart(), ... 대체 콜백이 뭐냐ㅠㅜㅠㅜㅠ 지금부터 알아보자^^

일단 StackOverflow에서 좋은 글을 읽었다.
stackoverflow - What is callback in Android?

Callback

아래 코드에서 class B가 class A에게 말한다.

"don't call us, we call you"

class A implements ICallback {
     MyObject o;
     B b = new B(this, someParameter);

     @Override
     public void onCallback(MyObject o){
           this.o = o;
     }
}

class B {
     ICallbackListener ic;
     B(ICallback ic, someParameter){
         this.ic = ic;
     }

    new Thread(new Runnable(){
         public void run(){
             // some calculation
             ic.onCallback(myObject)
         }
    }).start(); 
}

interface ICallbackListener{
    public void onCallback(MyObject o);
}

Class A calls Class B to get some work done in a Thread. If the Thread finished the work, it will inform Class A over the callback and provide the results. So there is no need for polling or something. You will get the results as soon as they are available.

In Android Callbacks are used f.e. between Activities and Fragments. Because Fragments should be modular you can define a callback in the Fragment to call methods in the Activity.

  • Listerner Interface : Callback Method 선언
  • class A : Callback Method 구현
  • class B : class A에게 작업한 결과를 Callback Method를 통해 알려줌

콜백 : 특정 조건이(이벤트가 발생되면) 충족되면 제가 알려드릴게요.
그러니, 콜백의 종류도 여러 가지겠죠?

이제 android developer - button로 한 번 가보자.

 public class MyActivity extends Activity {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         setContentView(R.layout.content_layout_id);

         final Button button = findViewById(R.id.button_id);
         button.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 // Code here executes on main thread after user presses button
             }
         });
     }
 }

setOnClickListener() 넌 누구냐? 클릭

View.setOnClickLustener(OnClickListener l)

  • View 클래스에 위치해 있다.
  • 말그대로 Listener를 설정해주는 메서드인 듯 하다.
  • Listener를 설정하는 메서드답게 인자가 리스너이다.
  • 해당 View 인스턴스가 clickable한 객체로 만들어주고
  • 인자로 받은 OnClickListener 인터페이스 인스턴스 l을 해당 View의 클릭리스너로 설정한다.
  • 같은 View 클래스 내에 위치한 OnClickListener 인터페이스이다. 클릭

View.OnClickListener

  • 해당 콜백(리스너)의 콜백 메서드인 onClick(View v)가 있다.
  • 지금 보니까
View.setOnClickListener(new View.OnClickListener() {
   public void onClick(View v) {
      // Code here executes on main thread after user presses button
   }
});
  • View에 ClickListener를 set하는 View 클래스의 메서드 실행
  • 인자로 콜백(리스너)를 넣는데, 구현해서 넣는 것이 간편
  • View.OnClickListener 인터페이스의 콜백 메서드인 onClick(View v) 구현

정리

버튼을 눌렀을 때 이를 감지하고 이에 맞는 동작을 하게 하려면 리스너 클래스를 만들어 이 클래스가 이벤트 감지 및 알맞은 동작을 하도록 콜백 메서드를 구현하면 된다.

  • call : 호출자가 피호출자를 부르는 것
    • 일반적으로 사용자가 시스템에 임의의 서비스를 호출하는 것이 보편적이다. 처리 루틴은 시스템에 있고 사용자가 해당 루틴을 요청함에 따라 동작이 일어난다.
    • 보편적 피호출자인 시스템을 호출한다.
  • 콜백(callBack) : 피호출자가 호출자를 부르는 것
    • 일반적인 call과 반대이다. 시스템 측에서 이벤트를 발생시켜 이 처리를 해달라고 요청해오는 과정에서 callBack이 사용된다.
    • 보편적 피호출자인 시스템이 피호출자를 호출한다.
    • Android O/S 시스템은 프로세스의 모든 상태 정보를 알고 있기 때문에, View 클릭 같은 이벤트를 감지하고 알려주는 것이 당연히 가능한 것이다.
  • (이벤트)리스너 : 이벤트 발생 여부를 기다리다가 이벤트 발생시 해당 이벤트에 맞는 처리를 수행하는 객체
    • 추상 메서드인 onTouch()를 받아서 사용하며 안드로이드에선 이벤트 리스너가 이벤트 핸들러 역할을 수행하기에 개념적 차이는 없다.
    • 사용자와 상호작용하는 이벤트 발생(click view) 시 안드로이드 프레임워크의 인터페이스(OnClickListener) 를 호출한다. 이 인터페이스를 실체화한 객체에서 이벤트에 맞는 처리(onClick 콜백메서드) 를 하는 걸 의미한다.
  • 콜백 메서드 : 이벤트 발생을 감지하기 위한 처리와 해당 이벤트 발생 시 실행할 각각의 처리를 나눠서 코딩하는 곳
    • 개발자가 해당 함수의 사용을 명령하는 게 아닌 이벤트, 메시지, 알람을 받았을 때 자동으로 실행되는 함수. 대부분 on으로 시작하는 함수들이 콜백 함수다.

콜백(System?) : 뷰가 클릭되면 콜백할게!
이벤트 리스너(인터페이스) : 특정 버튼의 클릭 이벤트 콜백을 기다릴게!
콜백 메서드(구현된 추상 메서드) : 리스너가 콜백 왔다고 알려주면 이거 할게!

Listener vs Observer

리스너 : 이벤트 발생 시 사용하는 개념
옵저버 : (데이터) 변경을 감지하기 위해 사용하는 개념
공통점 : 구현은 둘 다 인터페이스로 한다.

profile
한 눈에 보기 : https://velog.io/@dongwan999/LIST

0개의 댓글