LiveData的使用:
1.创建liveData对象, 注册observer, 监听observer的onChanged方法回调
2.已创建的liveData postValue或者setValue发送数据,在1中的onChanged能接收到 发送过来的数据, 可驱动当前ui更新
原理:
1.注册observer
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)
将observer作为map的key, 同时将owner和observer, (版本号)lastVersion=-1 , (是否活跃状态)mActive = false 封装到LifecycleBoundObserver中, 作为map的value, LifecycleBoundObserver也实现了LifecycleObserver接口
owner.getLifecycle().addObserver(wrapper);
addObserver目的是让LifecycleBoundObserver也能感知到宿主Activity/Fragment的生命周期变化
2.setValue/postValue 发送数据
livedata的版本号+1, mData赋值为最新值
发送,接收消息分3种情况
2.1 页面A处于可见状态, 页面A发送, 页面A接收
遍历map,获取到observer,当observer.lastVersion< mVersion,observer.lastVersion=mVersion,并调用onChanged方法
2.2 后台任务或者其他页面执行发送,页面A从不可见状态->可见状态
由于LifecycleBoundObserver能感知宿主的生命周期变化, 会执行onStateChanged回调, 当observer.lastVersion< mVersion,observer.lastVersion=mVersion并将最新的mData传给onChanged方法
2.3 黏性事件(页面A已执行发送,发送完跳转到刚创建的页面B,页面B监听到了页面A发送的数据)
页面B的LifecycleBoundObserver也监听到了宿主的生命周期变化, 当生命周期变成onStart时,会执行onStateChanged回调,当observer.lastVersion< mVersion,observer.lastVersion=mVersion并将最新的mData传给onChanged方法
黏性事件处理的常见方式:
1.重写observe方法, 通过反射,将LiveData的mVersion赋值给observer.lastVersion:
当页面A发送数据后,LiveData的mVersion自增+1, 跳转到页面B时, 页面B的LiveData在调用observe方法后, 会将mVersion赋值给observer.lastVersion,而LifecycleBoundObserver感知onStart生命周期后,会往下执行,当判断 observer.lastVersion = mVersion, 不会再往下执行,也就执行不到observer.onChange方法
2.其他的方式有使用自旋锁和UnPeekLiveData
为什么要给LifecycleBoundObserver, 1.宿主切换到活跃状态时,可以获取实时数据,驱动更新当前ui;2.当宿主生命周期执行到onDestroy, 自动移除observer,避免了内存的泄漏