💡Android Jetpack 구성요소인 LiveData에 대하여 기록하였습니다.
LiveData
- LiveData는 안드로이드 아키텍처 컴포넌트 중 하나로, 관찰 가능한 데이터 홀더 클래스입니다.
- UI와 데이터의 변경 사항을 반영하고, Observer에게 자동으로 알려줍니다.
- 일반 클래스와 달리 생명 주기를 인식하여 Activity, Fragment, Service 등 다른 앱 구성요소의 생명 주기를 인식합니다.
LiveData 개요 | Android Developers
생명주기 인식
- LiveData는 Activity, Fragment 등의 생명주기를 알고 있습니다.
- 데이터가 변경되더라도 UI 컴포넌트가 활성 상태일 때만 업데이트 됩니다.
활성 상태
- Activity 또는 Fragment가 STARTED 또는 RESUMED 상태에 있는 것을 의미합니다.
자동 데이터 업데이트
- LiveData는 Observer 패턴을 사용하여 데이터 변경 시 자동으로 UI 업데이트가 가능합니다.
- ViewModel에서 데이터가 변경되면 Observer에 등록된 UI 컴포넌트가 자동으로 이를 반영합니다.
데이터 일관성 유지
- LIveData는 데이터 일관성을 유지하기 위해 Activity나 Fragment가 비활성화 상태일 때 데이터를 업데이트하지 않으며, 다시 활성화될 때 최신 데이터를 제공합니다.
메모리 누수 방지
- LiveData는 Activity, Fragment가 소멸되면 자동으로 Observer를 해제하므로 메모리 누수를 방지합니다.
LifecycleOwner
- LifecycleOwner는 Android에서 Lifecycle을 추적하고 관리할 수 있는 객체입니다.
- Activity, Fragment, ViewModel 등에서 사용되며 생명주기를 추적하여 LifecycleObserver와 같은 컴포넌트가 생명주기의 특정 상태에 맞춰 적절한 동작을 할 수 있게 합니다.
- 이는 아키텍처 컴포넌트의 중요한 인터페이스이며, 이를 통해 컴포넌트의 생명주기 상태를 쉽게 관리할 수 있습니다.
interface LifecycleOwner {
fun getLifecycle(): Lifecycle
}
LifecycleObserver
- LifecycleOwner가 생명주기를 소유하면, LifecycleObserver는 이를 관찰하는 역할을 합니다.
- LifecycleObserver는 특정 이벤트에 반응하여 이를 처리할 수 있습니다.
class MyObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStartEvent() {
Log.d("MyObserver", "Activity가 시작되었습니다.")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStopEvent() {
Log.d("MyObserver", "Activity가 중지되었습니다.")
}
}
LifecycleOwner의 생명주기 상태
- LifecycleOwner는 아래와 같은 생명 주기 상태 변화를 가지며 생명주기가 변하면 이를 LifecycleObserver에게 알립니다.
- INITIALIZED : 초기화 상태
- CREATED : onCreate() 호출 후 상태
- STARTED : onStart() 호출 후 상태
- RESUMED : onResume() 호출 후 상태
- DESTROYED : onDestroy() 호출 후 상태
observeForever(Observer)
- 일반적으로 observe() 메서드를 사용하여 Observer를 LiveData에 연결하고, observe() 메소드가 LifecycleOwner를 가져오게 됩니다.
observeForever(Observer) 메소드를 사용하여 연결 된 LifecycleOwner 없이 Observer를 등록할 수 있습니다. 이 경우 Observer는 항상 활성 상태로 간주되므로 수정 관련 알림을 받게 됩니다.
LiveData 활용
- 일반적으로 LiveData는 ViewModel과 함께 활용됩니다.
class MyViewModel : ViewModel() {
// LiveData 선언
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
// 데이터 업데이트
fun updateData(newData: String) {
_data.value = newData
}
}
- [MutableLiveData] : 내부에서 값을 변경할 수 있는 LiveData로 ViewModel 내에서 데이터 업데이트가 필요한 경우 활용합니다.
- [LiveData] : 외부에서는 데이터를 읽기만 할 수 있도록 LiveData로 노출합니다.
- 캡슐화를 통해 외부에서 직접 데이터를 변경하지 못하도록 보호합니다.
Activity & Fragment에서 LiveData 관찰
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ViewModel 초기화
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
// LiveData 관찰
viewModel.data.observe(this, Observer { updatedData ->
// 데이터가 변경되면 UI 업데이트
textView.text = updatedData
})
// 데이터 변경
button.setOnClickListener {
viewModel.updateData("새로운 데이터")
}
}
}
- ovserve : LiveData가 변경될 때마다 Observer가 호출되어 UI를 업데이트합니다.
- this(Activity) or viewLifecycleOwner(Fragment)를 통해 생명주기를 인식하여, 해당 컴포넌트가 RESUMED 상태일 때만 데이터를 받습니다.
setValue()
- 메인 스레드에서만 호출 가능하며 UI 관련 작엡에서 사용됩니다.
_mutableData.value = "new value"
postValue()
- 백그라운드 스레드에서 호출할 수 있으며, 비동기로 값을 설정합니다.
_mutableData.postValue("new value")
정리
- LiveData는 Android 생명주기 인식 데이터 홀더 클래스로 UI와 데이터의 일관성을 유지하고, 데이터 변경 시 자동으로 UI 업데이트를 처리하는 기능을 제공합니다.
- ViewModel과 함께 사용하면 UI 데이터를 쉽게 관리하고, 구성 변경에도 데이터를 안전하게 유지할 수 있습니다.