LiveData의 Observer가 여러 번 감지될 때..

지프치프·2022년 7월 28일
0

Issue(error)

목록 보기
13/20

개요

Nexon에서 제공하는 던파API를 이용해서 앱을 만들고 있었다.
MainActivity를 하나 두고
Navigation을 이용하여 Fragment들을 관리하는 방식으로 만들고 있었다.
이렇게 만들면 하나의 ViewModel로 다른 Fragment들과도
일관성 있는 데이터 공유가 가능해서 이런 방식으로 만들고 있었는데
문제점은 여기서 발생했다.

재현

위와 같이 캐릭터가 장착 중인 장비, 아이템 검색은 Fragment와 Adapter는 다르지만
사용되는 객체가 동일하여 같은 ViewModel에서 동일한 LvieData 객체를 사용했고
클릭했을 때 아이템의 정보를 보여주는 Dialog 또한 동일했다.

하지만 아이템을 클릭하여 Dialog를 띄우면, 즉 LiveData를 한번이라도 갱신하면
Observer가 등록된 Fragment에 들어갔을때 지멋대로 Dialog를 띄우기 일쑤였다.

해결

3일을 고민하던 끝에.. 너무 화가 난 나머지
각 Adapter에서 직접 네트워크 연결을 하는 등 하드코딩을 할까 하다가
Activity가 하나이다보니 공유재처럼 사용되는 ViewModel이 종속되어 다른 Fragment에도
영향을 끼치는게 아닌가 하는 생각이 들었고

이 아이템 정보를 보여주는 코드만 다른 ViewModel로 분리해서
각 각의 Fragment에만 종속되도록 하면 어떨까 했는데
이는 성공적이었다.


기존에 MainViewModel이라는 Activity에 종속적인 ViewModel을 이용해서
다른 Fragment들에서도 사용해왔는데
itemInfo 기능만 분리한 ItemInfoViewModel을 새롭게 만들어주었다.

기존엔 itemInfo가 MainViewModel에 있었으니
run 함수는 지워야겠다.

아무튼 observer도 새로 추가해주고
테스트 해본 결과는 성공적이었다.

Activity의 ViewModel을 이용해서 하위 Fragment에서 값을 공유하고 편리하게 개발해보고자 했던 이 방법은 결국 공유라는 자체가 악영향으로 돌아오는 경우를 망각한 나의 실수이다..

앞으로 Activity ViewModel을 쓸 때 Fragment 간 공유되어 사용할 일이 없는 데이터는
Fragment 별로 ViewModel을 만든 다음에 독립적으로 사용해야겠다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글