버그 잡이

[Udacity android with kotlin] 5.Architectue - LiveData 본문

모던 안드로이드/Udacity Android with kotlin

[Udacity android with kotlin] 5.Architectue - LiveData

버그잡이 2020. 6. 15. 13:07

1. LiveData란?

 

An observable data holder class that is lifecycle-aware

- 옵저버 패턴이 적용된 (=특정 대상을 관찰하고 변화를 인지하는) -> 최신화

- 생명 주기를 인식하는 (=메모리를 효율적으로 쓰는)

 

 

옵저버 패턴이 적용되면 아래 그림 처럼 대상(subject)을 관찰하고

대상(subject)의 상태가 변화했을때 이를 감지할 수 있다.

 

 

그 대상을 LiveData로 만들면 옵저버 패턴을 보다 쉽게 구현할 수 있고

UI의 생명주기에 따라서 생성/소멸한다. ->  "생명주기가 onStarted, onResumed일때만 data를 update한다."

 

이렇게 쉽게 옵저버를 등록할 수 있다.

 

 

2. 사용법

 

1) LiveData 객체 생성 _ in ViewModel

 

val score = MutableLiveData<Int>()

 

 

2) data 변경(특정 이벤트 시) _ in ViewModel

 

fun onSkip(){
score.value = score.value - 1
}

 

 

3) UI에서 옵저버 설치 _ in Activity/Fragment

 

viewModel.score.observe(this, Observer { newScore ->
    scoreText.text = newScore.toString()
})

 

 

+ dataBinding과 함께 사용

*Activity.class

binding.lifecycleowner = this (activity일때)
binding.lifecycleowner = viewLifeCyleOwner (Fragment일때)

 

 

 

 

 


(추가_20.06.15)

 

 

 

 

 

 

1. Room과 함께 쓰일 수 있다.

 

 룸은 observable query를 지원합니다. 즉,  query의 반환값으로 LiveData를 사용할 수 있는 것 있다.

그 결과 해당 쿼리 부분의 data가 바뀌면 이를 observing하고 있는 곳에 notify해준다.

 

val query : LiveData<Item> = roomDao.getItem()

 

 

 

2. TransFormation LiveData

 

*Transformation.map()

val userLiveData: LiveData<User> = UserLiveData()
val userName: LiveData<String> = Transformations.map(userLiveData) {
    user
-> "${user.name} ${user.lastName}"
}

Transformation.map()을 활용하면 LiveData 원하는 형태로 변환 가능하다.

 

 

 

 

3. ObservableField의 notifychanged()

 

LiveData가 없었을때 ObervableField를 LiveData와 비슷한 용도로 사용할 수 있었다.

ObservableField는 notifyChanged()라는 메서드를 가지고 있어. 구독자들에게 신호를 줄 수 있었는데

liveData는 이 기능이 없다. 신호를 주기 위해서는 새로운 데이터를 set하는 수밖에 없다.

 

 

 

 

 

4. private로 livedata 캡슐화

*ViewModel.kt

private val _score MutableLiveData<Int>()
val score : LiveData<Int>() = _score

 

_score : 클래스 내부에서 사용할 데이터

score : 클래스 위부에서 받아 쓸 데이터 (Mutable이 아닌 LiveData이기 때문에 set이 안 됨.)

 

 

 

 

 

*참고

developer.android.com/topic/libraries/architecture/livedata

 

반응형
Comments