[Android] Android Jetpack LiveData? 살펴보기!
LiveData는 옵저버(관찰자) 패턴을 기본으로 하는 컴포넌트입니다. 읽기전 옵저버 패턴이란 무엇인지 간단하게 알아보시면 좋을 것 같습니다.
What is LiveData?
LiveData
는 수명주기를 인식하여 활성 상태에 있는 관찰자들 에게만 업데이트 하는 데이터 홀더 클래스입니다.
LifeCycle의 상태는 크게 5가지 상태로 존재합니다
- CREATED
- DESTROYED
- INITIALIZED
- RESUMED
- STARTED
LiveData
는 LifeCycle의 상태가 STARTED와 RESUMED이면 업데이트 정보를 알립니다.
LiveData
활성상태도.. 판단해서 업데이트해주고 그럼 어떤 장점이 있길래 이것을 쓸까요?
장점
- UI와 데이터 일치성 보장
- 최신 데이터 유지(화면에 의한 Fragment 재생성시)
- 메모리 누수 없음
- 비정상 종료 없음
이러한 강력한 장점때문에 LiveData
를 쓰지 않을 이유는 없을 것 같습니다
사용방법
LiveData
객체는 일반적으로 ViewModel
객채 내에서 초기화하여 사용합니다
액티비티 경우에서는 onCreate()
에서 obserev
를 합니다
Fragment
에서 옵저빙할 때 조심해야 할 부분이 있습니다.
구글도 실수했고 검색해보면 많이 나오지만 Fragment
에서는 lifeCycle
대상으로 this(Lifecyle) 대신에 LifeCycleOwner
를 사용합니다. this(Lifecyle)로 관찰을하게 된다면 파괴되고 다시 생성되는 Fragment
특성상 중첩된 관찰 때문에 이벤트가 다중으로 발생한다는 문제가 있습니다.
현재 this
를해도 빌드가 실패하진 않지만 빨간색으로 에러처리로 사용하지 말 것을 권고하고 있습니다.
그럼 observe
로 관찰을 시작했고 이벤트를 보내줘야겠죠?
LiveData
로 관찰자 대상에게 이벤트를 보내는 방식은 2가지가 있습니다
- setValue
- postValue
워커쓰레드에서 setValue 호출시
IllegalStateException: Cannot invoke setValue on a background thread 에러를 가 발생됩니다.
LiveData
에 값을 설정할 때 해당 스코프가 메인쓰레드인지 워커쓰레드인지 잘 구분하고 사용해야 합니다.
LiveData
는 Coroutine
, MediataLiveData
, Room
, DataBidning
등 AAC와 호환이 잘 되어있는 이점이 있습니다. 다음 포스팅에서는 LiveData
를 활용한 컴포넌트와의 상호작용을 다루겠습니다.