关于MediatorLiveData observe收不到回调

在一次编码中发现MediatorLiveData observe收不到回调,调试过程中发现存在如下两个问题:

1.需要手动调用一下setValue/postValue

2.source中需要存在活跃的livedata

关于第一条在MediatorLiveData类中的注解上有所声明

MediatorLiveData不会自动回调,得手动setValue/postValue一下给MediatorLiveData设置的observer才能收到回调,有些状态更新不及时可能跟这个有关;

修复方法也很简单,我们只需要在代码里手动赋值即可。

但是第二条需要活跃的livedata,是指在addSource的时候会去判断,如果有活跃observer的话就插入

那么刚开始的时候MediatorLiveData什么结果都没收到,可不就是不活跃么,这不是陷入了死循环,接着往下看才发现在onActive的时候也会调用plug去插入监听

onActive是继承LiveData的方法,我们点击查看引用处发现在activeStateChanged方法中调用了onActive(从方法名上来看好像是废话),并且这个时候也会对mActiveCount做+1操作,下次再调用addSource就直接plug了

接着追过去发现跟lifecycle做了绑定,在生命周期变为start的时候触发observe的活跃状态

但是项目执行中发现还是会存在一个异常case收不到回调,于是就用了trick的方法,直接对当前的MediatorLiveData添加observeForever

kotlin 复制代码
mainHandler.postAtFrontOfQueue { mediatorLivedata.observeForever {  } }

保证不管什么情况下该MediatorLiveDatahasActiveObservers()总返回true,总是能收到回调(记得自己去remove掉)

相关推荐
sky北城1 分钟前
You are not able to choose some of the languages, because locales for them a
android
儿歌八万首7 分钟前
Jetpack Compose 实战:打造高性能轮播图 (Carousel) 组件
android·前端·kotlin
QING61811 分钟前
Kotlin Flow 防抖(Debounce)详解
android·kotlin·android jetpack
QING61823 分钟前
Kotlin Flow 防抖(Debounce)、节流(Throttle)、去重(distinctUntilChanged) —— 新手指南
android·kotlin·android jetpack
AI视觉网奇1 小时前
android yolo12 android 实战笔记
android·笔记·yolo
海上飞猪1 小时前
【Mysql】Mysql的安装部署和使用
android·mysql·adb
我是好小孩1 小时前
【Android】项目的组件化搭建
android
aqi002 小时前
FFmpeg开发笔记(九十四)基于Kotlin的国产开源推拉流框架anyRTC
android·ffmpeg·kotlin·音视频·直播·流媒体
马 孔 多 在下雨2 小时前
Android 组件化开发基础实践
android
技术摆渡人2 小时前
Android 系统技术探索(2)构建大脑(System Services & PMS)
android