首先,LiveData是什么
LiveData是一种可以被观察的数据存储器类,它可以感知其他组件(比如Activity,Fragment)的生命周期,并只更新处于活跃状态的组件。当我们的应用组件处于STARTED或RESUMED状态,LiveData则会认为该组件处于活跃状态。
开始使用LiveData,LiveData一般搭配ViewModel一起使用
首先我们会创建一个ViewModel,在ViewModel里面在创建LiveData,并提供getter方法进行访问。
class NameViewModel : ViewModel() {
//LiveData是一个抽象类,一般使用它的 MutableLiveData 实现
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
接着在Activity的onCreate()方法中获取我们的NumViewModel (在依赖了Android KTX 中的 Fragment KTX模块后,可以直接使用viewModels和activityViewModels属性委托绑定到ViewModel),接着为LiveData注册观察者。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//获取ViewModel对象
val model = ViewModelProvider(this,
ViewModelProvider.NewInstanceFactory()).get(NameViewModel::class.java)
//创建观察者对象
val nameObserver = Observer<String> { name ->
//更新UI
}
//通过observe()来注册观察者
model.currentName.observe(this, nameObserver)
}
在注册观察者之后系统会立即调用onChange()方法,来提供currentName中的最新值,如果LiveData对象尚未在currentName中设置值,则onChange()方法不会被调用。
现在已经创建了LiveData对象并且设置了观察者。我们只需要更新LiveData对象就可以完成对onChange()方法的调用。LiveData提了setValue(T)和postValue(T)两个方法来更新值,第一个用来在主线程上使用,第二个用来在工作线程上使用。
button.setOnClickListener {
model.currentName.setValue("乌鸡哥")
}
LiveData 是怎么工作的
首先我们看下LiveData是如何注册一个观察者的
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
//该方法一定要在主线程上调用
assertMainThread("observe&