Android Data Binding Library #02
데이터 바인딩을 이용하여 View에서 발생하는 이벤트들을 바인딩할 수 있습니다.
안드로이드 데이터 바인딩 라이브러리를 이용하여 이벤트들을 바인딩하는 방법에 대해 알아보겠습니다.
먼저 기본적으로 View에서 발생하는 이벤트 처리 방법에 대해 알아보겠습니다.
View event들을 처리하기 위해서는 익명 클래스나 인터페이스 implements 등 여러 방법을 이용할 수 있습니다.
데이터 바인딩을 이용하여 View event들을 처리할 수 있습니다.
처리 방법에는 메서드 참조와, 리스너 바인딩 두 가지 방법이 있습니다.
아래와 같이 클래스에 선언된 메서드를 데이터 바인딩을 통해 Xml에서 직접 바인딩할 수 있습니다.
주의할 점은 매개변수와 리턴 타입이 모두 동일해야 합니다.
메서드 참조와 비슷하지만, 리스너 바인딩은 아래와 같이 임의의 데이터 바인딩 식을 이용할 수 있습니다.
리스닝 바인드는 메서드 참조와 다르게 리턴 타입만 일치하면 됩니다.
리스닝 바인드와 메서드 참조는 임의의 데이터 바인딩식을 이용할 수 있다는 점에서 차이가 있습니다.
메서드 참조 : 매개변수, 리턴 타입 모두 일치해야 함.
리스닝 바인드 : 리턴 타입만 일치해도 됨.
따라서 아래와 같이 구현한다면 동일하게 동작하게 할 수 도 있습니다.
하지만 이 둘은 실제 리스너 구현 시점에서 차이가 있습니다.
메서드 참조 : 데이터가 바인딩될 때 실제 리스너 구현이 생성됨.
리스닝 바인드 : 이벤트 발생할 때 실제 리스너 구현이 생성됨.
데이터가 바인딩될 때 리스너 구현이 생성되는 메서드 참조는 말 그대로 바인딩되는 시점에 데이터(매개변수)가 정의되어 있어야 합니다. 따라서 바인딩되는 시점에 데이터가 정의되어 있지 않다면 이벤트가 계속 동작하지 않게 되는 단점이 있지만 반대로 데이터가 정의되어 있다면 리스닝 바인드에 비해 좀 더 나은 성능을 기대할 수 있습니다.
// app/build/generated/source/apt/debug/android.databinding/Binding.java
...
public static class OnClickListenerImpl implements android.view.View.OnClickListener{
private com.main.view.MainListAdapter value;
public OnClickListenerImpl setValue(com.main.view.MainListAdapter value) {
this.value = value;
return value == null ? null : this;
}
@Override
public void onClick(android.view.View arg0) {
this.value.onClickText(arg0);
}
}
...
이벤트가 발생할 때 리스너 구현이 생성되는 리스닝 바인드는 이벤트가 발생할 때 데이터가 정의되어 있어야 합니다. 따라서 바인딩되는 시점에 데이터를 정의할 수 없는 비동기 데이터들에 적합합니다.
// app/build/generated/source/apt/debug/android.databinding/Binding.java
...
public final void _internalCallbackOnClick(int sourceId , android.view.View callbackArg_0) {
// localize variables for thread safety
// adapter
com.main.view.MainListAdapter adapter = mAdapter;
// adapter != null
boolean adapterJavaLangObjectNull = false;
adapterJavaLangObjectNull = (adapter) != (null);
if (adapterJavaLangObjectNull) {
adapter.startBrowser2(callbackArg_0);
}
}
...
// app/build/generated/.../generated.callback/Listener.java
public final class OnClickListener implements android.view.View.OnClickListener {
final Listener mListener;
final int mSourceId;
public OnClickListener(Listener listener, int sourceId) {
mListener = listener;
mSourceId = sourceId;
}
@Override
public void onClick(android.view.View callbackArg_0) {
mListener._internalCallbackOnClick(mSourceId , callbackArg_0);
}
public interface Listener {
void _internalCallbackOnClick(int sourceId , android.view.View callbackArg_0);
}
}
안드로이드 데이터 바인딩을 이용한 이벤트 처리도 결국 Java에서 Xml로 코드는 옮기는 작업이 필요합니다.
따라서 Java 코드가 좀 더 단순해지고, 반대로 Xml 코드는 복잡해지는 부분도 발생합니다.
앞선 내용과 이벤트 처리만을 토대로 생각해보면 데이터 바인딩을 통해 ViewModel과 View 사이의 의존성을 많이 줄일 수 있을 거 같습니다.
하지만 이것만으로는 부족한 점이 있습니다.
다음 글에서는 데이터 바인딩의 다른 부분을 다뤄보겠습니다.