저번 안드로이드 수명주기의 글에서 콜백이 자주 언급됐다. 안드로이드 수명주기는 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.OnClickListener
View.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Code here executes on main thread after user presses button
}
});
정리
버튼을 눌렀을 때 이를 감지하고 이에 맞는 동작을 하게 하려면 리스너 클래스를 만들어 이 클래스가 이벤트 감지 및 알맞은 동작을 하도록 콜백 메서드를 구현하면 된다.
- call : 호출자가 피호출자를 부르는 것
- 일반적으로 사용자가 시스템에 임의의 서비스를 호출하는 것이 보편적이다. 처리 루틴은 시스템에 있고 사용자가 해당 루틴을 요청함에 따라 동작이 일어난다.
- 보편적 피호출자인 시스템을 호출한다.
- 콜백(callBack) : 피호출자가 호출자를 부르는 것
- 일반적인 call과 반대이다. 시스템 측에서 이벤트를 발생시켜 이 처리를 해달라고 요청해오는 과정에서 callBack이 사용된다.
- 보편적 피호출자인 시스템이 피호출자를 호출한다.
- Android O/S 시스템은 프로세스의 모든 상태 정보를 알고 있기 때문에, View 클릭 같은 이벤트를 감지하고 알려주는 것이 당연히 가능한 것이다.
- (이벤트)리스너 : 이벤트 발생 여부를 기다리다가 이벤트 발생시 해당 이벤트에 맞는 처리를 수행하는 객체
- 추상 메서드인 onTouch()를 받아서 사용하며 안드로이드에선 이벤트 리스너가 이벤트 핸들러 역할을 수행하기에 개념적 차이는 없다.
- 사용자와 상호작용하는 이벤트 발생(click view) 시 안드로이드 프레임워크의 인터페이스(OnClickListener) 를 호출한다. 이 인터페이스를 실체화한 객체에서 이벤트에 맞는 처리(onClick 콜백메서드) 를 하는 걸 의미한다.
- 콜백 메서드 : 이벤트 발생을 감지하기 위한 처리와 해당 이벤트 발생 시 실행할 각각의 처리를 나눠서 코딩하는 곳
- 개발자가 해당 함수의 사용을 명령하는 게 아닌 이벤트, 메시지, 알람을 받았을 때 자동으로 실행되는 함수. 대부분 on으로 시작하는 함수들이 콜백 함수다.
콜백(System?) : 뷰가 클릭되면 콜백할게!
이벤트 리스너(인터페이스) : 특정 버튼의 클릭 이벤트 콜백을 기다릴게!
콜백 메서드(구현된 추상 메서드) : 리스너가 콜백 왔다고 알려주면 이거 할게!
Listener vs Observer
리스너 : 이벤트 발생 시 사용하는 개념
옵저버 : (데이터) 변경을 감지하기 위해 사용하는 개념
공통점 : 구현은 둘 다 인터페이스로 한다.