본문 바로가기

Android/Tips

커스텀 콜백 ( 리스너) 만들기

개발하면서 콜백 스타일의 코드들을 많이 보셨을 텐데요. 예를들면 서버의 API 호출 후 Response 데이터를 가져올 경우나, 스마트폰 자체 내에서는 사용자가 어떤 위젯을 터치 하고나서의 이벤트가 발생할 때 클릭 리스너가 동작하게 되어있습니다. 서버사이드에서 많이쓰는 NodeJS 의 경우에도  싱글 스레드의 비동기 방식의  콜백 기반으로 개발을 하게 됩니다.


개발을 하다보면 보통 특정한 함수 또는 이벤트를 발생시키고 어떤 그 뒤에 따르는 리스너? 콜러? 가 필요한 경우가 있습니다. 


근데 심지어 다른 클래스에서 어떤 프로세스를 진행하고 끝나는 결과로 콜백을 부르는 경우도 많이 생깁니다. 


이럴 때 보통 저는 3가지의 케이스로 개발을 하고있습니다. 


1. 다른 액티비티를 실행 후 결과로써 진행해야할 경우.

=> 액티비티의 startActivityForResult(int requestCode) 와 onActivityResult(int requestCode, int resultCode, Intent data) 를 이용하여 결과에 따른 이벤트를 분기하는 방법


2. 인터페이스를 이용한 방법 

=> 액티비티의 경우 인텐트에 해당 인터페이스 객체를 포함해 넘겨주어 사용, 다른 Custom한 클래스를 이용해서 결과이벤트를 받을경우는 생성자 또는 별도의 매개함수를 이용해서 해당 인터페이스 객체를 넘겨주어 결과에대한 콜백으로 해당 인터페이스의 메서드 호출 하는 방법.


3. 이벤트 버스 (EventBus, Otto 등 여러 이벤트 버스 기반 라이브러리가 있으니 아무거나 맞는 것으로 사용, Observer Pattern)  

=> EventBus, Otto 와 같은 옵저버패턴 기반으로 작성된 라이브러리 들을 이용해서  특정 이벤트 또는 결과를 전체 공지 또는 동작 시키고 싶을 때 이용하시면 매우 유용합니다. 




이번 글에는 커스텀한 클래스에 따라 콜백을 구성하기위해 인터페이스(Interface) 를 이용한 예제로 설명하겠습니다. ( AsyncTask를 써야 할 경우에도 결과 콜백 호출로 Handler와 Message를 이용해서 넘겨도 좋지만 인터페이스를 이용해도 좋습니다.). 



많은 설명보다는 코드로 보여드리겠습니다. 



1. 인터페이스 정의




2. 동작 커스텀 클래스 정의




3. MainActivity 에서 A클래스 작업 후 결과 콜백 동작





이런식으로 A 클래스에 인터페이스를 넘겨주어 원하는 작업을 하고 나서 결과 이벤트에 대해 Callback 이 호출됨.





인터페이스를 이용하여 원하는 콜백 리스너를 써보는 방법을 알아보았습니다. 첨언이 있거나 문제가 있다면 댓글 또는 Email 문의주시면 참고 하도록 하겠습니다. 



추가 Tip)

자바에서 쓰는 Interface  경우는 콜백 뿐만 아니라 여러 용도로 사용할 수 있는 좋은 녀석입니다. 참고사항으로 자바의 팩토리 패턴이나 컴포지트 패턴 부분을 찾아 보시면 다양한 인터페이스의 쓰임새를 아는데 도움이 되실 것입니다.