LiveData trong Android: Hiểu đúng, dùng đúng và khi nào nên thay thế bằng Flow
"LiveData từng là chuẩn vàng trong Android MVVM. Nhưng đến 2026, nó còn đáng dùng không?"

1. LiveData là gì?
LiveData là một observable data holder class thuộc Android Jetpack Architecture Components.
Hiểu đơn giản:
LiveData là một container chứa dữ liệu và tự động thông báo cho UI khi dữ liệu thay đổi.
Ví dụ:
val userName = MutableLiveData<String>()
Khi thay đổi:
userName.value = "Johnny"
UI đang observe sẽ tự động update.
Theo tài liệu Android:
"LiveData is an observable data holder class and is lifecycle-aware."
Nguồn:
https://developer.android.com/topic/libraries/architecture/livedata
2. Tại sao LiveData ra đời?
Trước LiveData, Android developer thường dùng:
- callbacks
- interfaces
- EventBus
- RxJava
Những vấn đề thường gặp:
- khó quản lý lifecycle
- dễ memory leak
- code phức tạp
Google tạo ra LiveData để giải quyết:
✅ lifecycle-aware
✅ đơn giản
✅ tối ưu cho MVVM
3. LiveData hoạt động như thế nào?
Kiến trúc cơ bản:
Repository
↓
ViewModel (LiveData)
↓
Activity / Fragment observes
Ví dụ trong ViewModel
class UserViewModel : ViewModel() {
private val _name = MutableLiveData<String>()
val name: LiveData<String> = _name
fun updateName() {
_name.value = "Johnny"
}
}
Observe trong Activity
viewModel.name.observe(this) { name ->
tvName.text = name
}
Khi _name thay đổi → UI sẽ update tự động.
4. Lifecycle-aware là gì?
Đây là điểm mạnh nhất của LiveData.
Ví dụ:
observe(viewLifecycleOwner)
Khi Fragment bị destroy:
- observer sẽ tự remove
Giúp tránh:
- Memory leak
- IllegalStateException
- NullPointerException
Theo Android Docs:
"LiveData only updates active observers."
5. setValue() vs postValue()
setValue()
liveData.value = data
hoặc:
liveData.setValue(data)
Dùng khi:
- đang ở main thread
postValue()
liveData.postValue(data)
Dùng khi:
- đang ở background thread
Ví dụ:
viewModelScope.launch(Dispatchers.IO) {
liveData.postValue(result)
}
6. MutableLiveData vs LiveData
Sai cách
val name = MutableLiveData<String>()
Expose trực tiếp sẽ dễ bị mutate ngoài ý muốn.
Đúng cách
private val _name = MutableLiveData<String>()
val name: LiveData<String> = _name
Lợi ích:
- encapsulation
- an toàn hơn
- đúng best practice của Google
7. MediatorLiveData
Dùng để combine nhiều nguồn dữ liệu.
Ví dụ:
val fullName = MediatorLiveData<String>()
fullName.addSource(firstName) {
fullName.value = "$it ${lastName.value}"
}
Use case:
- combine API + database
- combine nhiều LiveData
8. Transformations trong LiveData
map()
val upperName = Transformations.map(name) {
it.uppercase()
}
switchMap()
val user = Transformations.switchMap(userId) {
repo.getUser(it)
}
Dùng khi dữ liệu phụ thuộc nhau.
9. Hạn chế của LiveData
Dù rất tốt, LiveData vẫn có giới hạn.
1. Android-only
Không dùng được ngoài Android layer.
2. Reactive stream yếu
Các operator như:
- debounce
- merge
- combine
- zip
rất hạn chế.
3. Không mạnh về async pipeline
Không phù hợp để làm repository stream.
Google cũng khuyến nghị không dùng LiveData cho data layer.
4. Single Event issue
Ví dụ:
- Toast
- Navigation
Khi rotate màn hình:
LiveData có thể emit lại.
Đây là bug phổ biến.
10. LiveData vs StateFlow vs SharedFlow
| Feature | LiveData | StateFlow | SharedFlow |
|---|---|---|---|
| lifecycle-aware | native | cần repeatOnLifecycle() |
cần repeatOnLifecycle() |
| coroutine support | thấp | mạnh | mạnh |
| multiple collectors | tốt | tốt | rất tốt |
| one-time event | kém | kém | tốt |
| Kotlin-first | không | có | có |
11. Khi nào nên dùng LiveData?
Nên dùng nếu:
✅ dự án legacy
✅ XML + MVVM
✅ chưa migrate sang coroutine
Không nên nếu:
❌ project mới
❌ Jetpack Compose
❌ cần reactive mạnh
Khi đó nên dùng:
StateFlowSharedFlow
12. Recommendation cho 2026
Google hiện ưu tiên:
- Kotlin Coroutines
- Flow
- StateFlow
LiveData không deprecated,
nhưng không còn là lựa chọn ưu tiên cho app mới.
Kết luận
LiveData vẫn rất hữu ích vì:
- dễ học
- dễ dùng
- lifecycle-safe
- phù hợp legacy app
Nhưng:
"LiveData là quá khứ ổn định, Flow là tương lai reactive."
Nếu bạn maintain app cũ:
→ dùng LiveData.
Nếu build app mới:
→ chọn Flow.
References
1. Android Developers — LiveData Overview
https://developer.android.com/topic/libraries/architecture/livedata
2. Viblo — LiveData với Coroutines và Flow trong Android
https://viblo.asia/p/livedata-voi-coroutines-va-flow-trong-android-aWj533kQ56m
3. Evotek — Android Developer Roadmap: LiveData & Flow
All rights reserved