LiveData 是数据持有者,数据的更新能通过 Lifecycle 观察到。其实也就是说 Lifecycle 观察着 LiveData 数据的一举一动,当然这是有前提的,只有 Lifecycle 是活跃状态才行(活跃状态是指 STARTED, RESUMED,这也和 Activity, Fragment 的生命周期比较吻合,当页面不可见或者销毁时就不会触发通知,避免了内存泄漏或者空指针问题),但如果通过特殊方法注册的观察者,就可以认为永远都是活跃状态,这种就需要自己管理,在不需要观察时做移除操作。所以还是依照 Lifecycle 自身状态简单些,高级玩法先不谈。
LiveData 还提供了方法来获知是否有观察者在观察,这么做的好处是,要是没有观察者了,LiveData 就可以释放一些资源,等有观察者了再说,这样就没必要一直保持着了。
这么看来 LiveData 和 Lifecycle 结合起来用会比较的顺畅,来看一个 LiveData 注册观察者的方法
//方法入参中 owner 就代表着 Lifecycle 被观察者,之前有说过,Activity 就实现了这个接口
//所以可以简单理解为就是 Activity 对象
//入参 observer 的类型是 Observer,就是系统提供的 观察者类
public void observe(LifecycleOwner owner, Observer<? super T> observer) {
//这里就将入参 observer 传入创建了一个新对象
//LifecycleBoundObserver 实际上最终会实现 LifecycleObserver
//所以观察者应该就是 Lifecycle 的观察者
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
//这个就是 Lifecycle 添加观察者的操作
owner.getLifecycle().addObserver(wrapper);
}
所以 LiveData 和 Lifecycle 的关系绑定就是通过 observe 方法。还有一点就是 LiveData 是数据的持有者,那数据的来源需要设置。
LiveData 其实是个泛型抽象类,泛型 T 就表示数据来源。可以通过 postValue 和 setValue 方法来传值更新,区别是 postValue 可以运行在任意线程,其内部最终也是调用了 setValue 方法,因为 setValue 方法要求运行在主线程。
其实 LiveData 以及 Lifecycle 更多的是概念,光靠它们去实现某个功能是不太可能的,它们更倾向于将 Activity/Fragment 的生命周期扩展到业务逻辑层,使得整个应用都存在着生命周期感知。这也尽可能的简化了我们的逻辑处理,只要在合适的生命周期处理对应的事务就可以了。
相比于自己用 Lifecycle 来扩展生命周期,LiveData 帮我们自动处理了生命周期,所以我们只要关心 Observer 回调,不用自己再去实现 LifecycleObserver 了。
但如果 LiveData 仅仅只有这些功能,那就想的简单了,它可以利用 Transformations.map() 还有 Transformations.switchMap() 去做一些更改数据的操作,这个目前还没深入了解,后续有时间再了解下。
参考内容
「Android 进阶指北」
官方文档
网友评论