Android JetPack学习笔记之LiveData
前言
Jetpack 是 Android 软件组件的集合,使您可以更轻松地开发出色的 Android 应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。
最近有空边学习边把学习笔记做了。巩固知识,输入输出,强化学习,如有不对望指出,感谢。
(以下是对官方代码文档的翻译和自己的部分见解)
如果引用JetPack库
implementation 'android.arch.lifecycle:extensions:1.1.1'
LiveData
LiveData是一个可以在给定Lifecycle内观察到的数据持有者类。
这就意味着一个(lifecycleOwner)生命周期持有者添加了一个
观察者(observer),并且这个观察者(observer)只有当成对的LifecycleOwner处于活动状态时,才会通知观察者(observer)有关打包数据的修改。如果LifecycleOwner的状态Lifecycle.State== STARTED 或者 Lifecycle.State ==RESUMED的话,该LifecycleOwner是处于活动的。观察者通过observeforever(observer)被视为始终处于活动状态,因此将始终收到修改的通知。对于这些observers,你需要手动调用removeObserver来移除监听。
1.一个Lifecycle已订阅了一个Observer,如果Lifecycle的状态转变成Lifecycle.State==DESTROYED时那么Observer将自动被移除。这可以Activity/Fragment
帮助他们安全的观察LiveData并且不用担心内存泄漏,当他们销毁时将立即取消订阅
2. 另外,LiveData有onActive()(活动中)和onInactive()(不活动)方法用来获得Observer的活动状态从0到1发生改变。这允许LiveData在不需要一些Observers积极观察时释放一些繁重的资源。
3.这个类被设计用于持有ViewModel的单独数据字段,但也可以用于你的应用/解耦方式 中不同models的数据分享的
4. ViewModel只负责管理UI的数据,它不应该直接访问你的视图层次和持有你的Activity/Fragment的引用。(例如:不把视图对象或者Activity/Fragment的Context作为对象传入到ViewModel中。避免内存泄漏)
LiveData类图分析
LiveData源码分析
LiveData涉及到三个时序过程
1.Fragment/Activity通过LiveData.observe()方法添加观察者。
2.当调用LiveData.setValue/postValue方法时,触发onChange方法。通知观察者数据更新
3.当Fragment/Activity的活动状态改变时也会触发onChange方法
1.添加观察者
添加观察者有2中方式observe和observeForever
observe
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// 判断所属观察持有者(owner)的生命周期状态是否销毁
return;
}
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
//将owner和observer观察者加入SafeIterableMap中
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && !existing.isAttachedTo(owner)) {
//确保同一个观察者绑定同一个lifecycle
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) <