关于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掉)

相关推荐
rocpp6 小时前
Android 相册选择与拍照接入实践:MediaStore 分页、权限适配与 FileProvider
android
Flynt7 小时前
升级Flutter 3.44,我踩了HCPP和AGP 9的坑
android·flutter·dart
白色牙膏8 小时前
Cocos Creator 2.4.x 接入 AdMob 插件的迁移实践
android
我命由我1234510 小时前
C++ - 面向对象 - 常成员函数
android·java·linux·c语言·开发语言·c++·算法
tryqaaa_10 小时前
学习日志(四)【php反序列化魔术方法以及pop构造配实战】
android
Java小学生丶12 小时前
记录一下我的 Gradle 开发环境配置过程
android·java·gradle·maven·安卓
问心无愧051313 小时前
ctf show web 入门256
android·前端·笔记
霸道流氓气质13 小时前
MySQL 索引设计实战指南
android·数据库·mysql
R语言爱好者13 小时前
叠氮酸介绍
android
方白羽13 小时前
Android WebView 中实现第三方 QQ 登录的架构与流程详解
android·app