Jetpack--->LiveData知识点梳理
-
概述
LiveData是一种可观察的数据存储器类,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。通过给LiveData设置观察者,当LiveData所包裹的数据发生变化时,相应的观察者就会收到该数据的变化,进而就可以通过最新的数据进行相应的处理。另外,LiveData 只会将更新通知给活跃的观察者。为观察 LiveData对象而注册的非活跃观察者不会收到更改通知。如果观察者(由Observer 类表示)的生命周期处于Started 或Resumed 状态,则 LiveData 会认为该观察者处于活跃状态。
优势:
- 不会发生内存泄漏
观察者会绑定到Lifecycle对象,并在其关联的生命周期遭到销毁后进行自我清理。 - 不需要手动处理生命周期
- 数据始终保持最新状态
? 如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。
- 不会发生内存泄漏
-
基本使用
-
创建ViewModel
class NameViewModel : ViewModel() { // Create a LiveData with a String val currentName: MutableLiveData<String> by lazy { MutableLiveData<String>("zyt") } // 更新LiveData的时事件 fun changeName(newName: String){ currentName.value = newName } }
-
观察LiveData
class NameActivity : AppCompatActivity() { // 使用属性委派初始化ViewModel private val model: NameViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 创建Observer val nameObserver = Observer<String> { newName -> // 更新UI nameTextView.text = newName } // 给LiveData设置观察者 model.currentName.observe(this, nameObserver) } }
当我们在NameActivity中触发ViewModel中的changeName事件时,那麽观察者就会收到通知,通过onChange回调携带最新的value,进而实时更新UI界面。
-
-
Compose中实时观察数据(State)的使用方法
-
创建ViewModel
class HelloViewModel : ViewModel() { // LiveData holds state which is observed by the UI // (state flows down from ViewModel) private val _name = MutableLiveData("") // 初始值 空字符串 val name: LiveData<String> = _name // onNameChanged is an event we‘re defining that the UI can invoke // (events flow up from UI) fun onNameChanged(newName: String) { _name.value = newName } }
-
在Compose函数中设置观察者,观察LiveData的数据变化
val nameState by helloViewModel.name.observeAsState("zyt") // 设置初始值 “zyt" // 当然也可以不设置初始值,建议设置初始值,因为不设置初始值后面需要进行空校验 // 因为下面的语句,当HelloViewModel中的_name没有设置初始值空字符串,那么有可能就会报错, // 当然这个编辑器会进行提示的 // observeAsState() 的返回类型为 State<T?>,可以理解为通过属性委派获得value有可能为空, val name: String? by helloViewModel.name.observeAsState()
在上面的图中,当通过observeAsState()方法给LiveData设置观察者时,该方法会通过State对象来代表它的新值,然后当数据State发生变化时,在Compose中使用到State的地方就会发生重组。
-