LiveData
简介
LiveData是一个可观察的数据持有者类,与常规的Observable不同,LiveData可感知Activity、Fragment、Service的生命周期,确保LiveData仅更新处于活动生命周期状态的组件观察者。如果应用程序组件观察者处于started
或者resumed
,则LiveData认为该组件处于活跃状态,该组件会收到LiveData的数据更新,而其他注册的组件观察者将不会收到任何数据更新。
作用
优点
- 保持UI与数据的一致性:LiveData遵循观察者设计模式,当生命周期发生变化时,LiveData会通知对应的应用程序组件,数据发生变化时也会通知更新UI,类似于双向绑定。
- 避免内存泄漏:因为LiveData绑定了LifecycleOwner,而LifecycleOwner是用来监听组件的生命周期情况下的,所以,当组件被
destroy
之后,这些Observer
也会被自动清理。 - 避免 Activity
处于不活跃状态的时候产生崩溃:如果观察者(Observer)处于不活跃状态,则
Observer 不会接受任何 LiveData 事件。 - 不再手动处理生命周期:UI
组件只是观察相关数据,而不会停止或恢复观察,LiveData
会根据具体生命周期的变化而自动管理。 - 始终保持最新数据:如果生命周期为非活跃状态,则会在由非活跃状态转为活跃状态时接收最新数据,如从后台切换到前台自动接收最新数据。
- 正确处理配置更改:如果 Activity 或 Fragment
因为设备配置发生变化而重新创建,比如屏幕旋转等,也将会立即重新接收最新数据。
使用
通常LiveData都是和ViewModel一起出现的
-
在viewModel中创建LiveData(注:对应的Activity/Fragment
要支持LifeCycle)class UserModel(application: Application) : AndroidViewModel(application) { val userLiveData = MutableLiveData<User>() private var mApplication: Application? = null}
-
数据更新
val user:User = User()// setValue 在主线程中使用userLiveData.userLiveData.value = user // postValue 在子线程中使用(注:多次调用的时候可能只有最后一次有通知)userLiveData.userLiveData.postValue(user)
-
数据变化监听
val userModel = ViewModelProvider(this).get(UserModel::class.java) userModel.userLiveData.observe(this, Observer<User> { t -> username.text = t.toString() })// 使用 LiveData 对象的 observeForever 方法来将一个没有 LifecycleOwner 的类添加到观察者列表中userModel.userLiveData.observeForever(this, Observer<User> { t -> username.text = t.toString() })// 不过使用 observeForever 获得观察者对象会一直处于活跃状态,此时就需要我们手动调用 removeObserver(Observer) 移除该观察者。
在fragment中使用时
- 使用
viewLifecycleOwner
代替this
来绑定fragment - 注册
observe
要在onViewCreated
后面
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mViewModel.personList.observe(viewLifecycleOwner) { }
}
网友评论