Android开发把-LiveData-用于事件传递那些坑

本文讲述了Android开发中使用LiveData作为事件传递时遇到的问题,包括postValue的延迟更新和非激活状态下的数据丢失。作者通过分析和实践,提出通过创建一个LiveEventObserver来解决这些问题,该观察者保证所有事件不丢失,即使在非激活状态下也能在激活时回调。此外,作者还反思了自己的学习和面试准备,强调基础和全面学习的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.3、LiveData 就不是为传递事件准备的

从上面两点也可以看出,LiveData (或者说它的观察者) 在观察者激活之前并不关心中间经历过多少次数据变更,它只会在某个观察者激活时,传递给他最新的值,中间的值都不会起作用。
当然 LiveData 的设计也不是为了传递事件的,它是为了反应 View 当前状态的,View 层只需要根据当前 LiveData 的值去渲染数据就行,非激活状态时 View 都不可见,就算更新了也没意义。
我最开始也是觉得 LiveData 用到了观察者模式,而且可以进 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》开源 行一些不同 Fragment 之间数据通讯,就想到了事件总线,现在想想当时还是 too young too naive。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vdjk3LMX-1649940725173)(//upload-images.jianshu.io/upload_images/17428135-e1c09fe77a23f567.png?imageMogr2/auto-orient/strip|imageView2/2/w/289/format/webp)]

当然,也不是说 LiveData 也不是没救了,有谷歌给我们提供了强大的 Lifecycle 库,我们完全可以自己造一个不会丢事件的 LiveData

3、打造一个不会丢事件的 LiveData

LiveData 的其他功能做的很完善,只是会丢事件,我们要改造就要就针对上面的问题逐个击破。

3.1、postValue 的问题

对于 postValue 的问题,既然它最后也是调用的 setValue,丢数据是因为只抛了一次 Runable,那我们就自己每次都往主线程抛一个 Runable 就能解决这个问题

/**

  • LiveData 相关的工具类,简化 LiveData 操作
  • @author funnywolf
  • @since 2019-04-22
    /
    public class LiveDataUtils {
    private static Handler sMainHandler;
    /
    *
  • 用 setValue 更新 MutableLiveData 的数据,如果在子线程,就切换到主线程
    */
    public static void setValue(MutableLive
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值