안드로이드 공식문서
https://developer.android.com/topic/libraries/architecture/livedata?hl=ko
LiveData
LiveData는 관찰 가능한 데이터 홀더 클래스이다.
수명 주기를 인식하며, 활동 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트 한다.
관찰자의 수명 주기는 Observer 클래스로 표현되며, 생명 주기가 Started 또는 Resume 상태일 때 활성 상태로 간주한다.
활성 상태일 경우에만 업데이트 정보를 알린다.
공식 문서에서의 LiveData의 이점은 다음과 같다.
1. UI와 데이터 상태의 일치 보장
- Observer 객체에 UI를 업데이트
2. 메모리 누수 없음
- LifeCycle에 결합되어 있으므로 연결 된 LifeCycle 종료 시 자동 삭제
3. 중지된 Activity로 인한 비정상 종료 없음
- LifeCycle이 비활성 상태면 어떠한 이벤트도 받지 않음
4. Lifecycle을 더 이상 수동으로 처리하지 않음
- 관찰을 중지하거나 다시 시작하지 않고, 관찰하는 동안 Lifecycle 상태 변경을 인식하기에 자동 관리
5. 최신 데이터 유지
- 활성화(재활성화) 될 때마다 최신 데이터 갱신
6. 적절한 구성 변경
- Activity/Fragment가 재생성되어도 사용 가능한 최신 데이터 즉시 받음
7. 리소스 공유
- 싱글톤 패턴을 사용하는 LiveData 객체를 확장하여 시스템 서비스를 래핑할 수 있다.
class StockLiveData(symbol: String) : LiveData<BigDecimal>() {
private val stockManager: StockManager = StockManager(symbol)
private val listener = { price: BigDecimal ->
value = price
}
override fun onActive() {
stockManager.requestPriceUpdates(listener)
}
override fun onInactive() {
stockManager.removeUpdates(listener)
}
companion object {
private lateinit var sInstance: StockLiveData
@MainThread
fun get(symbol: String): StockLiveData {
sInstance = if (::sInstance.isInitialized) sInstance else StockLiveData(symbol)
return sInstance
}
}
}
class MyFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
StockLiveData.get(symbol).observe(viewLifecycleOwner, Observer<BigDecimal> { price: BigDecimal? ->
// Update the UI.
})
}
LiveData 변환
Transformations.map()
LiveData 객체에 저장된 값에 함수를 적용하고 결과를 다운스트림으로 전파
val userLiveData: LiveData<User> = UserLiveData()
val userName: LiveData<String> = userLiveData.map {
user -> "${user.name} ${user.lastName}"
}
Transformations.switchMap()
map()과 마찬가지로 LiveData 객체에 저장된 값에 함수를 적용하고 결과를 래핑 해제하여 다운스트림으로 전달 switchMap()에 전달된 함수는 다음 예와 같이 LiveData 객체를 반환해야 한다.
private fun getUser(id: String): LiveData<User> {
...
}
val userId: LiveData<String> = ...
val user = userId.switchMap { id -> getUser(id) }
'안드로이드 > Jetpack' 카테고리의 다른 글
[안드로이드] Navigation Component (0) | 2023.11.29 |
---|---|
[안드로이드] Jetpack (0) | 2023.11.24 |
[안드로이드] ViewModel (1) | 2023.11.24 |
[안드로이드] Databinding (1) | 2023.11.23 |
[안드로이드] Room DB (0) | 2023.11.23 |