Android架构组件——LiveData

LiveData是Android官方架构组件之一,在17年谷歌IO大会推出的,当时还是预览版,大致17年底时推出了正式版。

LiveData是什么?

从谷歌对LiveData的介绍("LiveData is an observable data holder class.")中我们得知LiveData是一个可观察的数据持有类,和普通的Observable不一样,LiveData可以感知Activity、Fragment、Service等组件的生命周期变化,从而确保数据的更新在组件的Activity状态周期执行。

那么使用Activity有何优势:

  1. 确保UI和数据状态保持一致
    LiveData属于观察者模式。当生命周期变化或者数据更新时,LiveData通知Observer对象发生变化,由observer的onChange响应执行UI更新。
  2. 没有内存泄漏
    Observers 是和LifeCycle对象绑定的,当LifeCycle对象被onDestroy()时,observers则被clean up。
  3. 在stop activities时不会奔溃
    当Observers的生命周期处于inactive状态时,例如activity被按返回键时,Observers将不会响应来自LiveData的事件。
  4. 不需要更多的手动管理生命周期
    LiveData 负责自动管理生命周期
  5. 保证数据是最新的
    比如处于后台的activity重新回到前台时,它将自动获得最新的数据。
  6. 响应屏幕旋转等配置变化
    当activity或者fragment因为屏幕旋转,或者语言等配置改变而重建时,它将接收最新的数据。
  7. 共享资源
    你可以extend LiveData,利用单例模式封装一些系统服务,当LiveData对象和系统服务连接后,所有需要该系统服务提供资源的observer可改为直接观察这个LiveData.

总结一下就是说:

LiveData 是一个可以感知 Activity 、Fragment生命周期的数据容器。当 LiveData 所持有的数据改变时,它会通知相应的界面代码进行更新。同时,LiveData 持有界面代码 Lifecycle 的引用,这意味着它会在界面代码(LifecycleOwner)的生命周期处于 started 或 resumed 时作出相应更新,而在 LifecycleOwner 被销毁时停止更新。

那么如何使用呢?

  1. 首先我们需要创建一个Livedata的实例来保存特定类型数据,这步操作通常在ViewModel类中完成。

    //创建LiveData对象
    class NameViewModel : ViewModel() {
    
        // Create a LiveData with a String
        val currentName: MutableLiveData by lazy {
            MutableLiveData()
        }
    
        // Rest of the ViewModel...
    }
    
  2. 创建一个定义了onChanged()方法的Observer对象,当LiveData对象保存的数据发生变化时,onChanged()方法可以进行相应的处理。通常在UI控制器中创建Observer对象。(PS:什么是UI控制器?比如Activity、Fragment)

    //观察LiveData对象
    class NameActivity : AppCompatActivity() {
    
        private lateinit var mModel: NameViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            // Other code to setup the activity...
    
            // Get the ViewModel.
            mModel = ViewModelProviders.of(this).get(NameViewModel::class.java)
    
            // Create the observer which updates the UI.
            val nameObserver = Observer { newName ->
                // Update the UI, in this case, a TextView.
                mNameTextView.text = newName
            }
    
            // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
            mModel.currentName.observe(this, nameObserver)
        }
    }
    
  3. 使用observe()方法将Observer对象注册到LiveData对象。 observe()方法还需要一个LifecycleOwner对象作为参数。 Observer对象订阅了LiveData对象,便会在数据发生变化时发出通知。 通常需要在UI控制器(如Activity或Fragment)中注册Observer对象。

    //更新LiveData对象
    mButton.setOnClickListener {
        val anotherName = "John Doe"
        mModel.currentName.setValue(anotherName)
    }
    

你可能感兴趣的:(Android架构组件——LiveData)