-
[Android] LiveData란안드로이드 2022. 2. 24. 12:41728x90반응형반응형
LiveData란👀
LiveData는 Data의 변경을 관찰할 수 있는 데이터 홀더 클래스입니다.
일반적인 Observable과는 달리 LiveData는 안드로이드 LifeCycle을 따르고 있습니다.
여기서 LifeCycle은 Activity, Fragment, Service 등과 같은 안드로이드 컴포넌트의 LifeCycle을 인식합니다.
이에 따라 LiveData는 해당 컴포넌트의 LifeCycle의 상태가 ACTIVE(STARTED or RESUMED) 일 때만 데이터를 업데이트합니다.
LiveData 객체는 Observer 객체와 함께 사용되어 LiveData가 가지고 있는 데이터에 어떤 변화가 감지되면 LiveData는 Observer객체에 변화를 알리고 Observer의 onChanged메서드가 실행됩니다.
LiveData는 LifeCyclerOwner라는 인터페이스의 getLifeCycle()를 통해 안드로이드 LifeCycle을 알고 있게 됩니다.
LiveData 장점👍🏻
- UI가 데이터 상태와 일치하는지 확인 : LiveData는 Observer 패턴을 따릅니다. 그에 따라 LiveData는 기본 데이터가 변경될 때 객체에 알립니다. 코드를 통합해 이러한 Observer객체의 UI를 업데이트할 수 있습니다. 그러면 Observer객체가 대신해주기 때문에 앱 데이터가 변경될 때마다 UI를 업데이트할 필요 없습니다.
- 메모리 누수 없음 : Observer는 개체에 바인딩되어 LifeCycle 관련 수명주기가 파괴될 때 스스로 정리됩니다.
- Stop 상태의 Activity으로 인한 충돌 없음 : Observer의 LifeCycle이 비활성 상태인 경우 (ex : Activity가 Back Stack에 있을 경우) LiveData 이벤트를 수신하지 않습니다.
- 추가적인 LifeCycle 처리가 필요하지 않습니다 : UI 구성요소는 관찰 데이터를 관찰할 뿐 관찰을 중지하거나 다시 시작하지 않습니다. LiveData는 관찰하는 동안 관련 LifeCycle 상태 변경을 인식하기 때문에 이 모든 것을 자동으로 관리합니다.
- 항상 최신 데이터 : LifeCycle이 비활성화되면 다시 활성화될 때 최신 데이터를 받습니다. 예를 들어 백그라운드에 있던 Activity는 포그라운드로 돌아온 직후 최신 데이터를 수신합니다.
- 리소스 공유 : 싱글톤 패턴을 사용해 LiveData 객체를 상속하여 앱에서 공유할 수 있도록 시스템 서비스를 래핑 할 수 있습니다.
LiveData 객체 사용 방법
- 특정 유형의 데이터를 보관할 LiveData 인스턴스를 생성합니다. 이것은 일반적으로 ViewModel 클래스 내에서 수행됩니다.
- 객체의 보유 데이터가 변경될 때 발생하는 상황을 제어하는 메서드인 onChanged()가 정의되어있는 Observer객체를 생성합니다. 일반적으로 Observer객체는 Activity나 Fragment 같은 UI 컨트롤러에서 객체를 생성합니다.
LiveData 간단 사용 방법
LiveData가 MVVM의 ViewModel과 함께 사용되기 때문에 ViewModel을 사용하여 사용방법을 구성했습니다!
1. ViewModel 클래스에 String 타입의 데이터를 받는 LiveData 생성
class NameViewModel : ViewModel() { // String 타입의 데이터를 관찰하는 LiveData 생성 val currentName: MutableLiveData<String> by lazy { MutableLiveData<String>() } ... }
위에서 생성한 LiveData는 Activity 또는 Fragment에 사용 때 onCreate()에 위치하는 게 적합합니다. 그 이유는👇🏻
- onResume()에 할 경우 pause()나 stop()에 의해 백그라운드에서 비활성화된 앱이 다시 활성화되면서 LiveData가 중복 호출될 수 있기 때문에 주의해야 합니다.
- Activity나 Fragment에 활성화되는 즉시 표시할 수 있는 데이터가 있는지 확인합니다. 앱 컴포넌트는 STARTED 상태가 되자마자 관찰 중인 개체의 가장 최근 값을 받아야 하기 때문에 onCreate()에 있어야 합니다.
2. LiveData 객체를 관찰하는 방법
class NameActivity : AppCompatActivity() { // 코틀린 ktx에서 제공하는 by(위임)을 사용해 ViewModel 초기화 private val viewModel: NameViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Observer 객체를 생성하여 UI에 업데이트 val nameObserver = Observer<String> { newName -> //newName이라는 새로운 데이터가 존재하면 업데이트 nameTextView.text = newName } // LiveData를 Observer 객체를 이용해 관찰하고 현재 Activity 또는 Observer를 LifeCycleOwner로 전달 viewModel.currentName.observe(this, nameObserver) } }
3. LiveData 객체 업데이트
button.setOnClickListener { val anotherName = "John Doe" viewModel.currentName.setValue(anotherName) }
위와 같이 특정 이벤트가 발생했을 때 setValue()와 postValue()를 통해 LiveData를 업데이트해줄 수 있습니다.
setValue vs postValue()🔥
- setValue() : 말 그대로 값을 set 하는 함수입니다. LiveData를 구독하고 있는 Observer가 있는 상태에서 setValue를 통해 값을 변경시킨다면 메인 스레드에서 그 즉시 값이 변경됩니다. 중요한 점은 메인 스레드에서 값을 dispatch 시킨다는 점입니다.
- postValue() : 백그라운드 Thread인 상황에서 LiveData값을 set 해주고 싶을 때 사용하는 함수입니다. 내부적으로 new Handler(Looper.mainLooper()). post(()->setValue()) 이런 코드가 실행됩니다. 즉 setting 하고 싶은 값을 main looper로 보내주기 때문에 결국 메인 Thread에서 값을 변경하게 됩니다. 따라서 postValue()를 한 다음 바로 다음 라인에서 getValue()를 호출한다면 변경된 값을 받아오지 못할 가능성이 큽니다.
출처
https://developer.android.com/topic/libraries/architecture/livedata
https://wooooooak.github.io/android/2019/06/11/Android_liveData_value/728x90반응형'안드로이드' 카테고리의 다른 글
[Android] 안드로이드 View 성능 올리는 꿀팁 feat.Naver Tech Concert 2020 (0) 2022.03.08 [Android] RecyclerView 사용법 (0) 2022.03.05 [Android]Glide 라이브러리를 통해 이미지 Load하기 (0) 2022.02.11 [Android] Android Context란? (0) 2022.02.07 [Android] SwipeRefreshLayout과 ScrollView 동시 사용시 문제 (0) 2022.01.24