原文链接:Android官方架构组件LiveData: 观察者模式领域二三事本文是 《Android Jetpack 官方架构组件 - 掘金
LiveData用法
public class MainActivity extends AppCompatActivity{
//1.实例化一个LiveData
public MutableLiveData<String> data = new MutableLiveData<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
//2.观察LiveData
data.observe(this, new Observer<String>() {
@Override
public void onChanged(String str) {
//4.观测到数据变更,可以拿到改变后的数据
}
});
}
@Override
protected void onResume(){
//3.在此处改变数据
data.setValue("XXXX");
}
}
也可以将其的值应用于某一布局,通过改变变量值实时更新布局。在xml文件中通过“@{变量}”的方式使用
LiveData
实际上就像一个 容器, 本文中它存储了一个String
类型的引用,每当这个容器内 String
的数据发生变化,我们都能在回调函数中进行对应的处理。
对于观察者来说,它并不关心观察对象 数据是如何过来的,而只关心数据过来后 进行怎样的处理。这也就是说,事件发射的上游 和 接收事件的下游 互不干涉,大幅降低了互相持有的依赖关系所带来的强耦合性。
LiveData如何避免内存泄漏
LiveData
,当它被我们的Activity
订阅观察,这之后Activity
如果finish()
掉,LiveData
本身会自动“清理”以避免内存泄漏。
根据断言可知,执行LiveData.observer()
方法时 必须处于主线程。
1.首先我们在调用LiveData.observer()
方法时,传递的第一个参数Activity
实际被向上抽象成为了 LifecycleOwner
,第二个参数Obserser
实际就是我们的观察后的回调。
2.方法内部实际上将我们传入的2个参数包装成了一个新的 LifecycleBoundObserver
对象,它实现了 Lifecycle 组件中的LifecycleObserver
接口:
3.在第三步中,对于一个可观察的LiveData
来讲,存在多个观察者同时订阅观察的情况,因此考虑到这一点,为每一个LiveData
配置了一个Map
存储所有的观察者。
4.将第2步包装生成的对象交给我们传入的 Activity
,让它在不同的生命周期事件中去逐一通知其所有的观察者,当然也包含了我们的LiveData
。
LiveData活跃状态
LiveData
内部存储的每一个LifecycleBoundObserver
本身都有shouldBeActive
的状态:
只有在onStart()生命周期后,onPause()之前的状态变更,才会处于活跃状态,只有处于活跃状态,回调才会被执行。
既然LiveData
已经能够实现在onDestroy()
的生命周期时自动解除订阅,为什么还要多此一举设置一个Active
的状态呢?
更多时候,新的Activity
运行在栈顶,旧的Activity
就会运行在 background
——这时旧的Activity
会执行对应的onPause()
和onStop()
方法,我们当然不会关心运行在后台的Activity
所观察的LiveData
对象(即使数据更新了,我们也无从进行对应UI的更新操作),因此LiveData
进入 InActive(待定、非活跃)状态,return
并且不去执行对应的回调方法,是 非常缜密的优秀设计 。
如果希望Activity在后台依旧可以响应数据变更,LiveData
提供了observerForever()
方法,在这种情况下,它能够响应到任何生命周期中数据的变更事件。