AAC LiveData의 등장으로 데이터바인딩 라이브러리 사용시 MVVM아키텍처와 맞물려 데이터와 UI간의 동기화하는 코드를 많이 사용하고 있습니다.

단수의 Data를 다루는데 있어서 LiveData는 편리했습니다.
기존 BaseObservable을 구현한 클래스에서 notifyChange 또는 notifyPropertyChange를 처리할 필요도없고,
생명주기를 알고있다는 점이 좋았습니다.

하지만,

복수의 Data인 List 또는 ArrayList 타입을 LiveData로 감싸서 사용하는 경우가 왕왕 생기곤 하는데요.
이 경우에 List의 Element를 추가하거나 제거 할 때 매우 귀찮은 일이 발생했습니다.

예를 들면 이런경우 입니다. 기존에 A,B,C 라는 아이템이 이미 있고, 

여기에서 하나의 아이템을 추가하거나 지우고 싶을 때가 있습니다.

단지 ArrayList였다면 add() 또는 remove() 호출뒤에 별도의 작업을 할 필요는 없지만 DataBinding과 LiveData를 쓰는 경우 UI동기화를 하기 위해 옵저버에게 notify를 하고 싶을 때가 있습니다.

그렇기 때문에 LiveData사용시 다시 setValue 또는 postValue 호출을 통해 옵저버에게 통지를 하게 되는데요. 

이 작업이 매우 귀찮습니다.

그래서 두가지 방법을 생각해 보았습니다.

LiveData와 List 따로 관리하기

add나 remove호출 등은 List에서만 처리하고 처리한 최종결과만을 LiveData에 넣어주는겁니다.

이 코드에서 중점적인 사항은 LiveData로부터 getValue()를 호출하지 않는 다는 것입니다. 그냥 새로운 결과를 덮어씌워줄 뿐이죠.

Custom LiveData 만들기

첫번째 방법도 좋지만 어쨌든 setValue를 매번 호출해주어야하는 부담감이 있습니다. 그래서 전 Custom Class를 만들기로 했습니다.

특별한 내용은 없습니다. 단지 add 및 remove 등의 구현을 MutableLiveData를 상속하여 구현한 것입니다. 또한 생성과 동시에 ArrayList를 만드므로 NPE로 부터 안전합니다.

더 좋은 방법이 있거나 다른 대안이 있다면, 댓글에 남겨주시면 감사합니다!

Buy me a coffeeBuy me a coffee
카테고리: AndroidJava

답글 남기기

이메일은 공개되지 않습니다.