LiveData

作者: EraJieZhang | 来源:发表于2024-10-11 11:41 被阅读0次

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一起出现的

  1. 在viewModel中创建LiveData(注:对应的Activity/Fragment
    要支持LifeCycle)

    class UserModel(application: Application) : AndroidViewModel(application) {    val userLiveData = MutableLiveData<User>()    private var mApplication: Application? = null}
    
  2. 数据更新

    val user:User = User()// setValue 在主线程中使用userLiveData.userLiveData.value = user
    // postValue 在子线程中使用(注:多次调用的时候可能只有最后一次有通知)userLiveData.userLiveData.postValue(user)
    
  3. 数据变化监听

    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) { }
}

相关文章

网友评论

      本文标题:LiveData

      本文链接:https://www.haomeiwen.com/subject/rcpgrjtx.html