본문 바로가기
개발/안드로이드

Android Architecture Components - LiveData API

by darksilber 2019. 5. 29.
반응형

출처 - https://tourspace.tistory.com/26?category=788397

 

정의 및 기능

LiveData는 Activity나 Fragment의 수명주기에 따라 Observable한 data holder 클래스 입니다.
따라서 어떤 데이터의 실시간 변화에 따른 UI 업데이트가 필요할 때 사용합니다.
Observer pattern을 사용하여, UI component가 data가 변화를 요청하여 변경점이 있으면 업데이트 하는것이 아니라, Data driven 방식으로 data가 변경되면 UI에게 업데이트를 알려주도록 합니다.
호출 관계가 뒤집힌것이죠.

특이한 점은 observer를 등록할때 LifecycleOwner (Activity나 Fragment)와 함게 pair로 등록하여, owner의 lifeCycle에 따라 noti를 줄지말지를 결정합니다.

lifeCycle은 아래 두가지 상태로 판단됩니다.
1. Active 상태: Owner의 상태가 STARTED 또는 RESUMED인 경우
2. InActive 상태: Owner가 그외의 상태인 경우

관찰하고 있는 data에 변화가 있더라도 active 상태가 아니라면 전달되지 않습니다.
또한 lifeCycle에 따라 DESTROY 상태가 되면 자동으로 해제되는 특징을 갖습니다.

이 클래스는 ViewModel안에서 개별 데이터 필드를 관리하도록 design 되었으나, 앱 안에서 다른 모듈간에도 데이터를 분리된 형태로(decoupled) 공유하는것이 가능합니다.

 

API 특징

위에 언급한대로 DESTORY 상태에서는 자동으로 observer가 remove되고 LifeCycleOwner역시 참조가 끊어지면서 leak을 방지할 수 있습니다.
onActive()와 onInactive()함수는 active된 observer가 하나라도 있는 경우와 하나도 없는경우에 불리므로 heavy한 resource에 대한 처리를 맡길 수 있습니다.
즉, onInactive()에 resource를 해제하는 코드를 넣고 onActive()에 resource에 접근을 시작하는 코드를 넣도록 design할 수 있습니다.

 

Public method

 

Return Type

Method Description

T

getValue()

현재값을 반환, Background thread에서 호출하면 마지막 set된값을 받는다고 보장할 수 없다.

boolean

hasActiveObservers()

Active 상태의 observer가 있으면 true, 아니면 false

boolean

hasObservers()

LiveData가 observer를 한개라도 가지고 있다면 true

void

observe(LifecycleOwner owner, Observer observer)

Lifecycle에 따라 동작하는 observer를 등록한다. main thread에서 호출하며, 이미 등록된 observer라면 observer 내용이 실행됨.
STARTED, RESUMED의 active 상태에서만 observer가 이벤트를 수신할 수 있고 DESTROYED상태로 이동하면 observer가 자동으로 제거됨.
inActive 상태에서는 데이터를 수신받을수 없으나, 다시 Active상태로 진입시 자동으로 데이터가 수신됨.
DESTORYED가 되기 전까지 LiveData와 owner, observer는 강한참조를 갖으나 DESTORYED되면 참조가 모두 제거됨.
등록시 이미 owner가 DESTROY 상태라면 무시된다.
같은 owner,observer 조합이 등록 요청되면 무시되며, 이미 등록된 observer가 다른 owner와 함께 등록 요청을 받는경우 IllegalArgumentException 발생.

void

observeForever(Observer observer)

owner 없이 등록하며, 이는 owner가 항상 active 상태인것처럼 동작한다. 따라서 모든 이벤트를 수신할 수 있으며, 자동으로 해제되지 않기때문에 명시적으로 removeObserver()를 불러줘야 한다.
만약 observer가 다른 owner와 함께 이미 등록된 상태라면 IllegalArgumentException을 발생 시킨다

void

removeObserver(Observer observer)

넘겨받은 observer를 list에서 해제한다.

void

removeObservers(LifecycleOwner owner)

넘겨받은 owner와 함께 등록된 observer를 제거한다

 

 

Protected methods

 

LiveData를 상속받아 class를 구현시 override 할수 있다.

 

Return Type

Method Description

void

onActive()

active observer의 개수가 0 -> 1로 변경될때.
따라서 이때 데이터를 실시간으로 업데이트를 시작해야 한다.

void

onInactive()

active observer의 개수가 1 -> 0로 변경될때.
observer가 전부 remove되거나 active 상태의 observer가 없을때

void

postValue(T value)

background thread에서 호출하는 경우 main thread에 값을 set하라고 post 시킨다. setValue()와 동시에 불리면 postValue 값이 나중에 처리되어 최신값이 될 수 있다.

void

setValue(T value)

main thread에서 호출하여 값을 set 시킨다. 등록된 active observer들에게 바로 전달된다
반응형

댓글