Android Architecture
迈向结构化的 App!
应用架构
将所有数据放在 fragment 中是不明智的。更好的解决方法是,让数据归数据,视图归视图。应用架构(application architecture)有许多种,本文将介绍其中一种:
ViewModel
UI Controller 用来控制 UI (废话hhh) ,ViewModel 则用来准备、维护和计算提供给 UI Controller 的具体数据。ViewModel 是一个抽象类,使用时需要继承并实现这个类。ViewModel 内部存储的数据在这里实现为 LiveData.
LiveData
LiveData 是一种可观察的对象。Activity/fragment 可以观察 LiveData 数据,并在其改变时收到通知。这样一来,ViewModel 只需关心数据的计算,无需关心通知数据使用者等“杂活儿”;而 activity 也只需观察 ViewModel,在其改变时做出反应即可。
Lifecycle Awareness
LiveData 可以察觉到它的观察者(如:activity)的生命周期;例如,如果 activity 处于不活跃状态(在屏幕中不可见),LiveData 不会通知其更新数据。
这样一来,activity 和 LiveData 的“观察”实质上是双向的,如下图:
代码
ViewModel & LiveData
编辑 app:build.gradle
,添加
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
继承 ViewModel
类,例如, GameViewModel
类:
class GameViewModel : ViewModel() {
var score = MutableLiveData<Int>()
var word = MutableLiveData<String>()
init {
score.value = 0
// Do something
}
fun updateScore() {
// Do something
}
}
在 fragment 或 activity 中,设置 observe 关系:
viewModel = ViewModelProviders.of(this).get(GameViewModel::class.java)
viewModel.score.observe(this, Observer { newScore ->
binding.textViewScore = newScore
})
Last modified on 2020-07-06