brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Nov 20. 2017

Android Data Binding

Android Data Binding Library #02

Android Data Binding


#01 Data Binding


데이터 바인딩을 이용하여 View에서 발생하는 이벤트들을 바인딩할 수 있습니다.

안드로이드 데이터 바인딩 라이브러리를 이용하여 이벤트들을 바인딩하는 방법에 대해 알아보겠습니다.




Basic Event Logic


먼저 기본적으로 View에서 발생하는 이벤트 처리 방법에 대해 알아보겠습니다.

View event들을 처리하기 위해서는 익명 클래스나 인터페이스 implements 등 여러 방법을 이용할 수 있습니다.

#02 Basic Event Logic




Data Binding Event Logic


데이터 바인딩을 이용하여 View event들을 처리할 수 있습니다.

처리 방법에는 메서드 참조와, 리스너 바인딩 두 가지 방법이 있습니다.





#01 메서드 참조


아래와 같이 클래스에 선언된 메서드를 데이터 바인딩을 통해 Xml에서 직접 바인딩할 수 있습니다.

#03 Data Binding Event Logic


주의할 점은 매개변수와 리턴 타입이 모두 동일해야 합니다.

#04 Same parameters & return type





#02 리스닝 바인딩


메서드 참조와 비슷하지만, 리스너 바인딩은 아래와 같이 임의의 데이터 바인딩 식을 이용할 수 있습니다.

#05 Data Binding Event Logic


리스닝 바인드는 메서드 참조와 다르게 리턴 타입만 일치하면 됩니다.

#06 Same return type




리스닝 바인드와 메서드 참조는 임의의 데이터 바인딩식을 이용할 수 있다는 점에서 차이가 있습니다.

메서드 참조 : 매개변수, 리턴 타입 모두 일치해야 함.

리스닝 바인드 : 리턴 타입만 일치해도 됨.


따라서 아래와 같이 구현한다면 동일하게 동작하게 할 수 도 있습니다.

#07 Same result


하지만 이 둘은 실제 리스너 구현 시점에서 차이가 있습니다.

메서드 참조 : 데이터가 바인딩될 때 실제 리스너 구현이 생성됨.

리스닝 바인드 : 이벤트 발생할 때 실제 리스너 구현이 생성됨.


데이터가 바인딩될 때 리스너 구현이 생성되는 메서드 참조는 말 그대로 바인딩되는 시점에 데이터(매개변수)가 정의되어 있어야 합니다. 따라서 바인딩되는 시점에 데이터가 정의되어 있지 않다면 이벤트가 계속 동작하지 않게 되는 단점이 있지만 반대로 데이터가 정의되어 있다면 리스닝 바인드에 비해 좀 더 나은 성능을 기대할 수 있습니다.

// 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);
    }

}





Android Data Binding


#08 From Java to Xml Layout


안드로이드 데이터 바인딩을 이용한 이벤트 처리도 결국 Java에서 Xml로 코드는 옮기는 작업이 필요합니다.

따라서 Java 코드가 좀 더 단순해지고, 반대로 Xml 코드는 복잡해지는 부분도 발생합니다.







앞선 내용과 이벤트 처리만을 토대로 생각해보면 데이터 바인딩을 통해 ViewModel과 View 사이의 의존성을 많이 줄일 수 있을 거 같습니다.

하지만 이것만으로는 부족한 점이 있습니다.

다음 글에서는 데이터 바인딩의 다른 부분을 다뤄보겠습니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari