티스토리 뷰

 

* 참고한 글

https://vagabond95.me/posts/live-data-with-event-issue/

 

[Android] MVVM 과 LiveData 조합 시 겪을 수 있는 이슈와 해결책 - 기록은 기억을 지배한다

이번 포스트에서는 MVVM 아키텍처에서 LiveData 를 사용하면서 겪었던 어려움과 여러 해결방법에 대해 적어보려한다. MVVM 에 대한 좋은 글은 이미 많이 있으므로 해당 포스트에서는 생략하고 넘어

vagabond95.me

 

https://seunghyun.in/android/6/

 

ViewModel에서 View(Activity, Fragment)로 이벤트를 전달하는 방법

ViewModel에서 Activity로 이벤트를 전달하는 안 좋은 방법과 이를 해결할 수 있는 방법들(SingleLiveEvent, Event wrapper)을 알아봅니다.

seunghyun.in

https://dwenn.tistory.com/114

 

[Android] Architecture Components 사용 시의 5가지 일반적인 실수

Architecture Components 사용 시의 5가지 일반적인 실수주의 : 이 글은 원문이 존재하는 글로, 본인은 그저 번역 / 의역한 것일뿐임을 알림.원문 : https://proandroiddev.com/5-common-mistakes-when-using-architecture-comp

dwenn.tistory.com

https://velog.io/@spdlqjfire/Android-Single-Live-Event

 

Android - Single Live Event

MVVM 패턴으로 프로젝트를 설계하고 개발하다 보면, 특정 이벤트 발생 시 ViewModel에서 값을 변경할 필요가 없는 경우가 발생한다. Android에서는 화면이 가로 혹은 세로로 전환될 때마다 View가 재활

velog.io

https://www.charlezz.com/?p=44609 

 

SingleLiveEvent 개선하여 더블 클릭 방지 하기! | 찰스의 안드로이드

SingleLiveEvent 개선하기 개요 SingleLiveEvent에 대한 설명은 이전 포스팅을 참조하자. Jetpack 라이브러리의 Android Arhitecture Component의 등장이후로 ViewModel과 LiveData를 열심히 사용중이다. View에 대한 ViewMod

www.charlezz.com

 

* 발생한 문제

- 서버에 값을 보내서 게시글을 작성하는 부분을 하고있었다

근데 보통은 게시글을 쓰고 나서 성공하면 그 화면에서 멈추는게 아니고 그 화면을 벗어나야 한다

- 그래서 나는 아래처럼 했다

일단 뷰 모델에서 결과값을 저장하는 라이브데이터를 만들었다

그리고 이렇게 값을 업데이트하고

프레그먼트에서 옵저브를 시켜서 값 변하면 뭔 값인지 보고 성공이면 성공했다고 토스트 보여주고 뒤로가기

실패면 실패 토스트 보여주고 뒤로가기

근데 이러니깐 문제가 생겼다

 

처음 게시글 작성할때는 잘 작동하고 그 다음 리스트화면으로 돌아간 다음 바로 또 작성 화면으로 갈라고하니 토스트로 게시글 작성 성공입니다 뜨고 화면 이동이 안되었다(정확히 말하면 순시간에 다시 리스트화면으로 돌아온것이겠지만)

그래서 다시 생각해보고 조사했다

 

 

위 처럼 viewLifecycleOwner를 사용하기때문에 이 프레그먼트의 view가 detach되면 viewmodel도 다시 옵저브되는것으로 알고있다(이 부분은 다시 자세히 찾아봐야될듯 함 view가 메모리에서 내려가게되면 viewmodel도 메모리에서 내려가는걸까?)

그런데 앞에서 봤듯 viewmodel에 있는 writeBoardResponseType이 남아있어서 리스트로 다시 되돌아갔다

그 말은 viewmodel이 계속 남아있었다는 뜻이다

viewmodel을 생성하는부분을 확인했다

activityViewModels로 되어있다

이렇게 뷰모델을 생성하면 activity에 viewmodel이 들어가고(?)

fragment간 viewmodel을 공유할 수 있다

지금 게시글 리스트 프레그먼트와 게시글 작성 프레그먼트는 viewModel을 공유중이다

그래서 리스트로 넘어가도 viewModel과 그 값이 그대로라서 게시글 작성 화면에서 다시 바로 리스트로 돌아온것이다

이를 더 확실히 알기위해 아래처럼 바꾸고 테스트했다

이렇게 바꾸고 다시 해보니 정상적으로(과연 정상일까) 작동했다

 

* 고민

그렇다면 어떻게 해야될까?

방법은 뷰모델을 분리하거나 어딘가에서 본 이벤트를 사용하는것이었다

성공, 실패 결과를 리스트 프레그먼트와 공유할 필요는 없지만 이거 하나때문에 뷰 모델을 새로만드는것은 낭비라고생각했다

그리고 그 어딘가에서 본 이벤트를 한번 써 보고 싶었다 그래서 뷰 모델을 새로 만들어 분리하지 않고 이벤트를 사용하기로 했다.

 

* 해결

찾아보니 SingleLiveEvent라는게 있단다 그 친구를 써보기로 했다

 

SingleLiveEvent?

ViewModel에서 화면 회전하면 view가 재활성화됨

근데 이때 viewModel에 있는 값은 변화가 없는데 그냥? view가 재활성화되면서 옵저빙도 다시 하면서 변화가 없지만 observe안에 있는 블록이 실행됨

근데 진짜 "postValue()"할때만 observe되게 하고싶을수도있잖음

그럴때 사용하는게 SingleLiveEvent이다

SingleLiveEvent는 LiveData를 상속받는 클래스임

아.. 근데 다시 자세히 읽어보니 SingleLiveEvent라는게 지원되는게 아니고 내가 직접 만들어야하는듯했음 ㄱ-

 

근데 이거 프로젝트 코드에서 어디에선가 Event를 봤단말임?

그래서 슥.. 들어가서 봤는데 다른 팀원이 만들어놓은 Event 클래스가 있었다

 

진짜 최고 ^.^ 이거 가져다 쓸란다

이 이벤트 관련한 내용은

https://seunghyun.in/android/6/

 

ViewModel에서 View(Activity, Fragment)로 이벤트를 전달하는 방법

ViewModel에서 Activity로 이벤트를 전달하는 안 좋은 방법과 이를 해결할 수 있는 방법들(SingleLiveEvent, Event wrapper)을 알아봅니다.

seunghyun.in

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함