0

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

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:

  • StateFlow
  • SharedFlow

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

https://tuyendung.evotek.vn/android-developer-roadmap-hieu-ve-livedata-flow-va-lap-trinh-phan-ung-trong-android/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí