0Pricing
Android Academy · 课时

ViewModel 与 LiveData

使用 ViewModel 应对配置变更。通过 LiveData 暴露响应式数据流,并在 Activity 和 Fragment 中观察数据。

ViewModel 与 LiveData 是 CoddyKit 上的免费 Android Academy 课时。 这是第 1 节课,共 6 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 6 节课。

Activity 的问题

直接在 Activity 中存储数据有两个主要问题:

  • 用户旋转手机时,Activity 会被销毁并重新创建,所有数据都会丢失
  • 如果在 onCreate 中从网络获取数据,每次旋转都会重新获取,造成浪费

ViewModel 可以解决这两个问题。

什么是 ViewModel?

ViewModel 是 Android 架构组件,具有以下特点:

  • 可以在配置变更时保留(旋转、主题变更)
  • 保存与界面相关的数据和业务逻辑
  • 只有当用户永久离开屏幕时才会被销毁

经验法则:如果数据应该在旋转后保留,请将其放入 ViewModel。

创建 ViewModel

继承 ViewModel,并将其添加到 Gradle 依赖中:

// app/build.gradle:
// implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
// implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'

import androidx.lifecycle.ViewModel

class CounterViewModel : ViewModel() {

    var count = 0
        private set

    fun increment() {
        count++
    }

    fun reset() {
        count = 0
    }
}

在 Activity 中获取 ViewModel

使用 ViewModelProvider(或 by viewModels() 委托)获取 ViewModel 实例:

import androidx.activity.viewModels

class CounterActivity : AppCompatActivity() {

    private lateinit var binding: ActivityCounterBinding
    // Android manages the ViewModel lifecycle — never instantiate it yourself
    private val viewModel: CounterViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityCounterBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // This shows the count is preserved after rotation!
        binding.tvCount.text = viewModel.count.toString()

        binding.btnPlus.setOnClickListener {
            viewModel.increment()
            binding.tvCount.text = viewModel.count.toString()
        }
    }
}

什么是 LiveData?

LiveData 是可观察的数据持有者。界面会观察 LiveData 的值,并在值发生变化时自动更新。

  • 感知生命周期,仅更新处于活动状态的观察者(Activity 在后台时不会崩溃)
  • 始终保持最新,新观察者会立即获得最新值

ViewModel 中的 LiveData

私下使用 MutableLiveData(ViewModel 可以写入),公开暴露为 LiveData(界面只能观察):

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class CounterViewModel : ViewModel() {

    private val _count = MutableLiveData(0)
    val count: LiveData<Int> = _count  // read-only for the UI

    fun increment() {
        _count.value = (_count.value ?: 0) + 1
    }

    fun reset() {
        _count.value = 0
    }
}

在 Activity 中观察 LiveData

调用 .observe(lifecycleOwner) { value -> } 响应变化:

class CounterActivity : AppCompatActivity() {

    private val viewModel: CounterViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...

        // Automatically updates TextView whenever count changes
        viewModel.count.observe(this) { count ->
            binding.tvCount.text = count.toString()
        }

        binding.btnPlus.setOnClickListener { viewModel.increment() }
        binding.btnReset.setOnClickListener { viewModel.reset() }
    }
}

LiveData 与 State Flow

LiveData 是经典方案。现代 Kotlin 代码通常会改用 Kotlin 协程中的 StateFlow:

  • StateFlow — 基于协程,不依赖 Android
  • 在 Activity 中使用 repeatOnLifecycle 收集
  • 更适合复杂的状态管理

两者都很好用:LiveData 更容易入门;在大型应用中,您会看到 StateFlow。

包含多个观察者的 ViewModel

多个界面组件可以观察同一个 LiveData。例如,TextView 和 Button 的启用状态都可以响应 ViewModel 中的同一个数据值,而无需在 ViewModel 中添加任何额外代码。

这样可以清晰地分离关注点:ViewModel 保存状态,界面只负责观察和呈现。

快速检查

ViewModel 何时会被销毁?

总结:ViewModel 与 LiveData

现在您已经了解如何构建感知生命周期的界面:

  • ViewModel 可以在配置变更时保留(旋转)
  • 在 Activity 中使用 by viewModels() 获取 ViewModel
  • MutableLiveData(私有)/ LiveData(公开)模式
  • 使用 .observe(this) { value -> updateUI(value) } 进行观察
  • 界面会自动更新,无需手动刷新

下一步:使用 Room 数据库永久保存数据。

常见问题解答

「ViewModel 与 LiveData」课时是免费的吗?

是的 — 「ViewModel 与 LiveData」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 6 节课。

「ViewModel 与 LiveData」这节课中我会学到什么?

使用 ViewModel 应对配置变更。通过 LiveData 暴露响应式数据流,并在 Activity 和 Fragment 中观察数据。 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Android Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 6 节。

「ViewModel 与 LiveData」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Android Academy 课中编写并运行代码吗?

能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. ViewModel 与 LiveData
  2. Room 数据库
  3. 协程与挂起函数
  4. 仓储模式
  5. Navigation 组件
  6. 使用 Hilt 进行依赖注入
← 返回 Android Academy