LiveData
LiveData는 Data의 변경을 관찰할 수 있는 Data Holder 클래스입니다.
이는 일반적인 Observable과는 다르게 LifeCycleOwner를 통해 안드로이드 생명주기를 알고 있습니다.
즉, 액티비티나, 프레그먼트, 서비스 등과 같은 안드로이드 컴포넌트의 생명주기를 인식하며 그에 따라 LiveData는 활성 상태일 때만 데이터를 업데이트 합니다.
또한, LiveData 객체는 Observer 객체와 함께 사용됩니다.
LiveData가 가지고 있는 데이터에 어떠한 변화가 일어날 경우, LiveData는 등록된 Observer 객체에 변화를 알려주고 Observer의 onChanged() 메소드가 실행되게 됩니다.

LiveData 개요 | Android 개발자 | Android Developers
LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.
developer.android.com
LiveData 사용 이점
1. Data와 UI 간 동기화
LiveData는 Observer 패턴을 따릅니다.
그에 따라 LiveData는 데이터 변경이 일어날 때마다 Observer 객체에게 알립니다.
이러한 방식으로 사용자가 매번 UI를 업데이트 하는 코드를 작성할 필요 없이 Observer 객체에서 자동으로 UI를 업데이트 하는 코드를 넣어 데이터의 상태와 UI를 일치시킬 수 있습니다.
2. 메모리 누수 없음
Observer 객체는 안드로이드 생명주기 객체와 바인딩되어 있기 때문에 컴포넌트가 destroy 될 경우 메모리 상에서 스스로 해제합니다.
3. Stop 상태의 액티비티와 Crash 발생 없음
액티비티가 Back Stack에 있는 것처럼 Observer의 생명 주기가 비활성화 상태일 경우, Observer는 LiveData의 어떤 이벤트도 수신하지 않습니다.
4. 생명 주기에 대한 추가적인 조작 필요 없음
LiveData가 안드로이드 생명 주기에 따른 Observing을 자동으로 관리해주기 때문에 UI 컴포넌트는 그저 관련된 데이터를 "관찰"하기만 하면 됩니다.
5. 최신 데이터 유지
기기 회전과 같은 화면 구성의 변경 또는 수명 주기가 비활성화되었다 다시 활성화될 때 LiveData는 최신 데이터를 수신합니다.
6. 자원 공유
싱글톤 패턴을 사용하여 LiveData를 확장해 앱에서 공유할 수 있도록 시스템 서비스를 래핑할 수 있습니다.
LiveData 객체는 시스템 서비스에 한번 연결되면 리소스가 필요한 Observer는 LiveData 객체를 관찰할 수 있습니다.
LiveData 사용하기
1. LiveData 객체 생성
LiveData는 immutable 하기에 thread-safe 하지만 값을 변경할 수 없어서 MutableLiveData를 통해 값을 변경하고 LiveData는 해당 값을 immutable 하게 받습니다.
class MyViewModel : ViewModel() {
// String 타입의 LiveData 생성
private val _myLiveData by lazy { MutableLiveData<String>() }
val myLiveData: LiveData<String> by lazy { _myLiveData }
}
2. LiveData 객체 관찰
LiveData는 Observer 인터페이스를 사용하여 관찰합니다.
Observer 인터페이스에는 유일한 메서드인 onChanged()가 있습니다.
이는 LiveData의 값이 변경되었을 때 호출되는 콜백 메서드로, 메서드 안에서 LiveData의 값을 받아 사용합니다.
대부분의 경우, 앱 컴포넌트의 onCreate() 메서드 내에서 LiveData에 Observer를 달아 관찰을 시작합니다. 그 이유는 다음과 같습니다.
- 시스템이 액티비티 또는 프래그먼트의 onResume() 메서드에서 LiveData에 대한 코드가 중복 호출을 하지 않도록 하기 위해서입니다.
- 액티비티나 프래그먼트가 활성화되는 즉시 표시할 데이터가 있는지 확인합니다. 앱 컴포넌트가 STARTED 상태에 있는 즉시 관찰 중인 LiveData 객체로부터 가장 최근 값을 수신합니다. 이것은 LiveData 객체가 이미 onCreate() 메서드 내에서 설정된 경우에만 발생합니다.
observe() 메서드에 Observer 객체를 전달하면 즉시 Observer 객체 안에 구현한 onChanged()가 호출되어 myView에 저장된 가장 최근 값을 제공받습니다.
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// DataBinding
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// ViewModel 객체 생성
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
// Observer 객체 생성
val myObserver = Observer<String> {
override fun onChanged(t: String?) {
binding.myView.text = t
}
}
// 현재 Activity 및 Observer를 LifecycleOwner로 전달하여 LiveData 관찰
viewModel.myLiveData.observe(this, myObserver)
// Observer + observe 코드를 한꺼번에 선언하는 코드
viewModel.myLiveData.observe(this) {
binding.myView.text = it
}
}
}
3. LiveData 객체 업데이트
MutableLiveData의 setValue() 또는 postValue() 메서드를 통해 LiveData 객체를 업데이트합니다.
이 두 메서드 모두 ViewModel에서 결과 데이터를 LiveData에 담는 역할을 합니다.
둘의 차이가 있다면 postValue() 메서드는 백그라운드 스레드에 의해 동작하고 setValue() 메서드는 메인 스레드에 의해 동작합니다.
class MyViewModel : ViewModel() {
private val _myLiveData by lazy { MutableLiveData<String>() }
val myLiveData: LiveData<String> by lazy { _myLiveData }
// 액티비티에서 호출할 메서드
fun postDataValue(myData: String) {
// setValue()를 사용하여 값 셋팅
_myLiveData.value = myData
}
}
'안드로이드 > 개념' 카테고리의 다른 글
[Android] 앱 아키텍처 패턴 (MVC, MVP, MVVM, MVI) (0) | 2023.10.27 |
---|---|
[Android] 정규표현식 (0) | 2023.10.11 |
[Android] ViewBinding과 DataBinding (0) | 2023.10.08 |
[Android] Touch (0) | 2023.10.06 |
[Android] @JvmOverloads (0) | 2023.08.06 |
LiveData
LiveData는 Data의 변경을 관찰할 수 있는 Data Holder 클래스입니다.
이는 일반적인 Observable과는 다르게 LifeCycleOwner를 통해 안드로이드 생명주기를 알고 있습니다.
즉, 액티비티나, 프레그먼트, 서비스 등과 같은 안드로이드 컴포넌트의 생명주기를 인식하며 그에 따라 LiveData는 활성 상태일 때만 데이터를 업데이트 합니다.
또한, LiveData 객체는 Observer 객체와 함께 사용됩니다.
LiveData가 가지고 있는 데이터에 어떠한 변화가 일어날 경우, LiveData는 등록된 Observer 객체에 변화를 알려주고 Observer의 onChanged() 메소드가 실행되게 됩니다.

LiveData 개요 | Android 개발자 | Android Developers
LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.
developer.android.com
LiveData 사용 이점
1. Data와 UI 간 동기화
LiveData는 Observer 패턴을 따릅니다.
그에 따라 LiveData는 데이터 변경이 일어날 때마다 Observer 객체에게 알립니다.
이러한 방식으로 사용자가 매번 UI를 업데이트 하는 코드를 작성할 필요 없이 Observer 객체에서 자동으로 UI를 업데이트 하는 코드를 넣어 데이터의 상태와 UI를 일치시킬 수 있습니다.
2. 메모리 누수 없음
Observer 객체는 안드로이드 생명주기 객체와 바인딩되어 있기 때문에 컴포넌트가 destroy 될 경우 메모리 상에서 스스로 해제합니다.
3. Stop 상태의 액티비티와 Crash 발생 없음
액티비티가 Back Stack에 있는 것처럼 Observer의 생명 주기가 비활성화 상태일 경우, Observer는 LiveData의 어떤 이벤트도 수신하지 않습니다.
4. 생명 주기에 대한 추가적인 조작 필요 없음
LiveData가 안드로이드 생명 주기에 따른 Observing을 자동으로 관리해주기 때문에 UI 컴포넌트는 그저 관련된 데이터를 "관찰"하기만 하면 됩니다.
5. 최신 데이터 유지
기기 회전과 같은 화면 구성의 변경 또는 수명 주기가 비활성화되었다 다시 활성화될 때 LiveData는 최신 데이터를 수신합니다.
6. 자원 공유
싱글톤 패턴을 사용하여 LiveData를 확장해 앱에서 공유할 수 있도록 시스템 서비스를 래핑할 수 있습니다.
LiveData 객체는 시스템 서비스에 한번 연결되면 리소스가 필요한 Observer는 LiveData 객체를 관찰할 수 있습니다.
LiveData 사용하기
1. LiveData 객체 생성
LiveData는 immutable 하기에 thread-safe 하지만 값을 변경할 수 없어서 MutableLiveData를 통해 값을 변경하고 LiveData는 해당 값을 immutable 하게 받습니다.
class MyViewModel : ViewModel() { // String 타입의 LiveData 생성 private val _myLiveData by lazy { MutableLiveData<String>() } val myLiveData: LiveData<String> by lazy { _myLiveData } }
2. LiveData 객체 관찰
LiveData는 Observer 인터페이스를 사용하여 관찰합니다.
Observer 인터페이스에는 유일한 메서드인 onChanged()가 있습니다.
이는 LiveData의 값이 변경되었을 때 호출되는 콜백 메서드로, 메서드 안에서 LiveData의 값을 받아 사용합니다.
대부분의 경우, 앱 컴포넌트의 onCreate() 메서드 내에서 LiveData에 Observer를 달아 관찰을 시작합니다. 그 이유는 다음과 같습니다.
- 시스템이 액티비티 또는 프래그먼트의 onResume() 메서드에서 LiveData에 대한 코드가 중복 호출을 하지 않도록 하기 위해서입니다.
- 액티비티나 프래그먼트가 활성화되는 즉시 표시할 데이터가 있는지 확인합니다. 앱 컴포넌트가 STARTED 상태에 있는 즉시 관찰 중인 LiveData 객체로부터 가장 최근 값을 수신합니다. 이것은 LiveData 객체가 이미 onCreate() 메서드 내에서 설정된 경우에만 발생합니다.
observe() 메서드에 Observer 객체를 전달하면 즉시 Observer 객체 안에 구현한 onChanged()가 호출되어 myView에 저장된 가장 최근 값을 제공받습니다.
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // DataBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main) // ViewModel 객체 생성 viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Observer 객체 생성 val myObserver = Observer<String> { override fun onChanged(t: String?) { binding.myView.text = t } } // 현재 Activity 및 Observer를 LifecycleOwner로 전달하여 LiveData 관찰 viewModel.myLiveData.observe(this, myObserver) // Observer + observe 코드를 한꺼번에 선언하는 코드 viewModel.myLiveData.observe(this) { binding.myView.text = it } } }
3. LiveData 객체 업데이트
MutableLiveData의 setValue() 또는 postValue() 메서드를 통해 LiveData 객체를 업데이트합니다.
이 두 메서드 모두 ViewModel에서 결과 데이터를 LiveData에 담는 역할을 합니다.
둘의 차이가 있다면 postValue() 메서드는 백그라운드 스레드에 의해 동작하고 setValue() 메서드는 메인 스레드에 의해 동작합니다.
class MyViewModel : ViewModel() { private val _myLiveData by lazy { MutableLiveData<String>() } val myLiveData: LiveData<String> by lazy { _myLiveData } // 액티비티에서 호출할 메서드 fun postDataValue(myData: String) { // setValue()를 사용하여 값 셋팅 _myLiveData.value = myData } }
'안드로이드 > 개념' 카테고리의 다른 글
[Android] 앱 아키텍처 패턴 (MVC, MVP, MVVM, MVI) (0) | 2023.10.27 |
---|---|
[Android] 정규표현식 (0) | 2023.10.11 |
[Android] ViewBinding과 DataBinding (0) | 2023.10.08 |
[Android] Touch (0) | 2023.10.06 |
[Android] @JvmOverloads (0) | 2023.08.06 |