MutableLiveData와 LiveData는 Android에서 데이터를 관찰하고 UI를 업데이트하는 데 사용되는 클래스입니다. 이 두 클래스는 모두 Android Architecture Components의 일부입니다.
LiveData:
LiveData는 데이터를 관찰하고 UI를 업데이트하는 데 사용되는 데이터 홀더 클래스입니다. LiveData는 생명주기를 인식하므로, 이를 사용하면 앱의 생명주기와 관련된 문제를 피할 수 있습니다. LiveData는 활성 상태인 관찰자만 업데이트하므로, 앱이 백그라운드에 있거나 액티비티가 종료된 경우 메모리 누수를 방지할 수 있습니다.
MutableLiveData:
MutableLiveData는 LiveData의 하위 클래스로, 값을 변경할 수 있는 LiveData입니다. LiveData는 추상 클래스이므로 직접 인스턴스화할 수 없습니다. 따라서 값을 변경하려면 MutableLiveData를 사용해야 합니다.
차이점:
LiveData는 값을 변경할 수 없지만, MutableLiveData는 값을 변경할 수 있습니다. 이는 LiveData가 불변성을 유지하도록 설계되었기 때문입니다. MutableLiveData는 LiveData에 값을 설정하고 변경하는 메서드를 추가로 제공합니다.
class MyViewModel : ViewModel() {
private val _name = MutableLiveData<String>()
val name: LiveData<String> get() = _name
}
여기서 _name은 MutableLiveData 인스턴스이며, 이를 통해 값을 변경할 수 있습니다. name은 LiveData 타입으로, 이를 통해 값을 관찰할 수 있습니다.
class MyViewModel : ViewModel() {
private val _name = MutableLiveData<String>()
fun setName(newName: String) {
_name.value = newName
}
}
여기서 _name은 MutableLiveData 인스턴스이며, setName 메서드를 통해 _name의 값을 변경할 수 있습니다. 이렇게 하면 _name의 값을 관찰하고 있는 모든 관찰자가 알림을 받고 UI를 업데이트할 수 있습니다.
보통 두가지를 함께 사용해 데이터를 불변성을 유지하고 업데이트 해줍니다.
class MyViewModel : ViewModel() {
// MutableLiveData instance
private val _count = MutableLiveData<Int>()
// Expose LiveData, not MutableLiveData
val count: LiveData<Int> get() = _count
init {
_count.value = 0
}
fun incrementCount() {
_count.value = (_count.value ?: 0) + 1
}
}
이 예시에서는 _count라는 MutableLiveData 인스턴스를 생성하고 초기화합니다. 그런 다음 count라는 LiveData를 통해 _count를 외부에 노출합니다. 이렇게 하면 외부에서는 count를 관찰하고 변경사항을 받을 수 있지만, count의 값을 직접 변경할 수는 없습니다. 이는 LiveData의 불변성을 유지하면서도, 필요한 경우에만 값을 변경할 수 있도록 합니다.
incrementCount 메서드를 통해 _count의 값을 변경할 수 있습니다. 이 메서드를 호출하면 _count의 값이 증가하고, 이를 관찰하고 있는 모든 관찰자가 알림을 받아 UI를 업데이트할 수 있습니다. 이렇게 하면 앱의 생명주기와 관련된 문제를 피하면서도, 데이터의 변경사항을 안전하게 관찰하고 반영할 수 있습니다.
'Android' 카테고리의 다른 글
Android Compose에서 LiveData 대신 State, Flow 써야하는 이유 (0) | 2023.05.26 |
---|---|
Android 잠금화면 lockscreen 만드는 방법 (0) | 2023.05.20 |
Mac에서 apk 일괄 압축풀기 (0) | 2023.05.16 |
Fragment 로만 앱을 만들면 좋은점 (0) | 2023.05.14 |
AAC의 ViewModel 과 MVVM의 ViewModel의 차이점 (0) | 2023.05.13 |
댓글