什么是 LiveData?
一个具有生命周期感知能力的可观察的数据存储类。
- 生命周期感知能力
- 可观察
- 数据存储
Activity 生命周期的状态和事件
LiveData 只会将更新通知给处于活跃状态的观察者,活跃状态指观察者的生命周期在STARTED或者 RESUMED。当观察者处于 DESTROYED时会自动移除该观察者。
为什么使用 LiveData?
- 无需手动处理生命周期
- 不会发生内存泄漏
- 始终保持页面数据为最新
- 页面间共享数据
- 官方出品,与 Room 配合食用更佳
LiveData 什么时候会通知更新
- 数据发生改变时
- 组件从非活跃状态更改为活跃状态
- 第二次从非活跃状态更改为活跃状态时不会更新
从更新的时机来看,我们需要在组件的 onCreate 方法中执行观察方法,确保数据可以通知。比起在 onResume 方法中手动更新数据更加的高效。
LiveData 中的操作符
- map: 与 RxJava 中的 map 类似
- switchMap: 与 RxJava 中的 flatMap 类似
- distinctUntilChanged: 与 RxJava 中的 distinctUntilChanged 类似,只有当数据本身发生改变时才通知下游。
- MediatorLiveData: 当上述操作符无法满足需求时,可使用 MediatorLiveData 来自定义操作符。
LiveData 的错误用法
- 使用 Fragment 作为 LifecycleOwner 传入 observe 方法
- 在 onCreate 方法中获取网络数据
❎ 错误的做法:如果 Activity 重建,会重新去请求一次数据,这是没有必要的。
✅ 只在需要更新数据时,才去请求网络数据。 - 暴露可变的 LiveData 对象给外部
为什么项目中会有 Event 和 _EventObserver_?
从前面 LiveData 的更新时机我们不难发现,observe 方法会回调多次。但是对于 toast、startActivity、showDialog 等事件我们只会消费一次。
Event和EventObserver保证了事件只会被处理一次。
是不是任何场景下都可以使用 LiveData?
当然不是,只要当数据与 UI 有相关关系时才应该使用 LiveData。
讨论:对于一些入口是否显示的控制应该使用 LiveData 吗
LiveData 与 RxJava
虽然 LiveData 和 RxJava 都属于观察者模式的实现,但是他们的本质是完全不同的。
LiveData 只是数据的储存类,本身不支持复杂的线程操作和事件序列,也没有异常处理。与 RxJava 相比,具有体积小,学习成本低等优点。
RxJava 是一个完整的基于事件的观察序列,用来处理异步操作的框架。使用 RxJava 可以方便的切换线程,同时 RxJava 拥有的众多操作符也可以让逻辑变的清晰可循。配合 Retrofit 大大地简化了网络操作。但是学习曲线较陡,大部分人只会一些简单的操作。
在 Android 中可以使用 https://github.com/uber/AutoDispose 来避免 RxJava 存在的内存泄漏。
LiveData 与 EventBus
EventBus 也是一种观察者模式的实现,但她更多的被应用于模块间的通信,比如一些全局性的事件通知,类似登录这样的。而不是像 LiveData 一样只关心当前页面的数据。
Cold or Hot
cold observable 只有当事件被订阅时才会执行发射数据的代码。当有多个订阅者时,他们之间的事件是相互独立的。
hot observable 事件的发生于订阅的时机无关,多个订阅者可以订阅同一数据源。
举个形象一些的 🌰,cold 是耳机,hot 是音响
LIveData 是 Hot observable,RxJava 大部分情况下是 Cold observable。
关于 Cold 和 Hot 的理解,可以参考这篇文章:
https://medium.com/@benlesh/hot-vs-cold-observables-f8094ed53339