一、入门
1.1、初级官方demo
class NameViewModel : ViewModel() {
// 这里new了一个MutableLiveData,它是LiveData的实现类,LiveData是抽象的,很明显不能被new
val currentName: LiveData<String> by lazy {
MutableLiveData<String>()
}
}
class NameActivity : AppCompatActivity() {
private lateinit var mModel: NameViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mModel = ViewModelProviders.of(this).get(NameViewModel::class.java)
// 这个this是LifecycleOwner
mModel.currentName.observe(this, Observer { newName ->
// mNameTextView一个TextView
mNameTextView.text = newName
})
// 更新被观察者数据,LiveData会通知观察者
mModel.currentName.postValue("MDove")
}
}
如果看到这几行代码,豁然开朗,那么可以跳过看下面的部分。如果感觉有些疑惑,不着急咱们不打针不吃药,坐下就是和你唠…
1.2、demo解释
最开始我们先声明了一个NameViewModel的ViewModel,这部分内容在ViewModel篇有所提及。内部有一个MutableLiveData的成员变量。说白了就是一个LiveData类型的String,我们使用时是借助LiveData的特性,但本质还是用String。
也就是说这里如果我们要用一个List,那么此时就是MutableLiveData<List>()。
Activity之中,我们先获取ViewModel,然后mModel.currentName.observe(…,…),这里我们就是在观察LiveData。我们只需要在回调中处理我们自己的UI操作即可了。也就是demo中的mNameTextView.text = newName。
LiveData会在每一次postValue(…)或者value=…时,observe()便会回调,哪怕是null。
注意
这里有俩个点需要特别注意:
- 1、LiveData是生命周期感知的,在当前的LifecycleOwner不处于活动状态(例如onPasue()、onStop())时,LiveData是不会回调observe()的,因为没有意义。
- 2、如果LiveData没有被observe(),那么此时你调用这个LiveData的postValue(…)/value=…,是没有任何作用。这个我们可以在源码中看到。
1.3、不同的LiveData实现类(系统实现)
MutableLiveData:
上文咱们已经见过了,没什么特别的,就是LiveData的实现类。就相当于List和ArrayList的关系。
MediatorLiveData:
MutableLiveData的子类,它是一个比较强大的LiveData,我们的map()、switchMap()都是基于它进行实现的。
最大的特点是可以同时监听多个LiveData。
二、进阶
官网的这个小破demo,属实太寒酸了,你倒是加点特技啊?就这中初级用法,谁能觉得好用呢!所以,如果对LiveData稍稍有点感觉,那咱们不要停,一起决战到天明。
2.1、map()
初用过RxJava的小伙伴,估计会和我一样,被各种“姿势”的操作符所正经,比如常用的:map、flatMap…而LiveData中同样有这样的操作。
一个很常见的场景:我们通过一个唯一id去查询这个id下的实体类,并且要同时展示二者的数据。很简单的业务逻辑,在LiveData中的展示是这样的: