livedata+ lambda遇到的坑

news2024/11/19 1:50:14

首先抛出个异常

FATAL EXCEPTION: main

Process: com.lion.media, PID: 5513

java.lang.IllegalArgumentException: Cannot add the same observer with different lifecycles

at androidx.lifecycle.LiveData.observe(LiveData.java:199)

这是在livedata.observe(this) {

// ...

}触发的异常

下面分析下

从源码看,试图将observer在两个lifecycle注册到livedata就会触发这个异常,正常情况下很难遇到这个问题,但是有些情况容易出现问题:

前提:livedata的生命周期比和订阅这个livedata页面长

  1. 页面没有正常销毁,又创建一次

  1. 两个页面用同一个类,比如Fragment, 这个fragment里订阅livedata

反编译发现:

如果lambda内没有引用外部非静态成员,会被编译程类似单例的类

livedata.observe((LifecycleOwner)this, -$$Lambda$RadioCatalogFragment$caW7Hi16aKYOCUVWVHqIazPGd8s.INSTANCE);

一般情况是new出来的

livedata.observe((LifecycleOwner)this, new -$$Lambda$RadioCatalogFragment$aQGE2mZtdMX-nI-7aVkDUov6kPw(this))

如何解决:

  1. 不要使用lambda,改用object

  1. lambda内引用外部非静态变量或方法

另外网传一种方案:

class SafeMutableLiveData<T>: MutableLiveData<T>() {

private var weakLifecycleOwner: WeakReference<LifecycleOwner>? = null

override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {

weakLifecycleOwner?.get()?.let {

removeObservers(it)

}

weakLifecycleOwner = WeakReference(owner)

super.observe(owner, observer)

}

override fun setValue(value: T) {

try {

super.setValue(value)

} catch (e: Exception) {

super.postValue(value)

}

}

}

这种方案不可取,原因是如果这个livedata有很多个页面都要订阅时,就错误了,setValue方法到不错,可用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android studio Logcat 新版使用命令指南 常用命令集合

只过滤自己的包名 package:mine 过滤自己的包名且只看error级别日志 package:mine level:error 指定消息内容包含12288 message:12288 指定内容不包含12288 -message:12288 其中有 message: 、message~、-message和 -message~ -&#xff1a;对当前标签的过滤结果取反…

智能驾驶 车牌检测和识别(三)《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)》

智能驾驶 车牌检测和识别&#xff08;三&#xff09;《CRNN和LPRNet实现车牌识别&#xff08;含车牌识别数据集和训练代码&#xff09;》 目录 智能驾驶 车牌检测和识别&#xff08;三&#xff09;《CRNN和LPRNet实现车牌识别&#xff08;含车牌识别数据集和训练代码&#xf…

2022个人年度总结:拒绝无效努力,实现破圈成长。

在从毕业一直到现在&#xff0c;我都会写一篇关于自己的从技术、商业、人情世故以及未来展望的博文&#xff0c;以至于归纳每个时期的自己&#xff0c; 走在互联网开发的边缘&#xff0c;不得不抽出时间鞭策自己学习新知识&#xff0c;未知的知识是 充满好奇的&#xff0c; 就好…

第五章 ArcGIS数据编辑

文章目录第一节 创建新要素方法1 开始编辑、保存编辑、停止编辑2 捕捉的使用3 创建点、线、面4 编辑器中工具的使用5 根据其他要素创建要素6 注记要素编辑和修改第二节 属性编辑常见方法1 属性编辑2 字段计算器3 字段计算器的特殊应用4 计算几何第三节 模版编辑方法1 定义模版2…

Spring学习笔记(一)【BeanUtils.copyProperties方法】

Spring下的BeanUtils.copyProperties方法是深拷贝还是浅拷贝&#xff1f; 一、浅拷贝深拷贝的理解 简单地说&#xff0c;拷贝就是将一个类中的属性拷贝到另一个中&#xff0c;对于BeanUtils.copyProperties来说&#xff0c;必须保证属性名和类型是相同的&#xff0c;因为它是根…

Windows下安装Python和配置easygui

一、需求说明需要学习Python内容&#xff0c;或者是运行Python程序&#xff0c;需要在Windows系统下进行安装配置Python的相关环境&#xff0c;以便让程序能够正常运行使用。二、安装Python2.1、下载Python安装包打开Python官网下载自己Windows系统需要的Python版本选择【Downl…

大宇无限将全部业务系统都部署在亚马逊云科技上

随着移动互联网的高速发展&#xff0c;人们对精神文化内容消费的追求不断提高&#xff0c;利用互联网技术&#xff0c;便捷地享受资讯内容成为了当代人的诉求。为了实现这个目标&#xff0c;大宇无限面临的首要挑战是如何利用大数据系统高效地分析数据、了解用户的消费行为和国…

1、数据库安装超详细教程(MySql5.0版本)

1.1、SQL概述 SQL&#xff0c;一般发音为sequel&#xff0c;SQL的全称Structured Query Language)&#xff0c;SQL用来和数据库打交道&#xff0c;完成和数据库的通信&#xff0c;SQL是一套标准。但是每一个数据库都有自己的特性别的数据库没有,当使用这个数据库特性相关的功能…

Quarkus入门体验,22ms启动一个Web服务

简介 Quarkus是类似于Spring Boot的框架&#xff0c;可以方便大家进行Java开发。利用GraalVM的魔力&#xff0c;能更好的适应云原生的场景&#xff0c;极快的启动速度。 创建项目 在IDEA就直接有创建Quarkus项目的初始化工具&#xff0c;直接根据自己需要填好即可&#xff0…

分享一个可以看历史影像的网站

概述 众所周知&#xff0c;由于某些原因&#xff0c;大家以前经常用的历史地图已经看不了了&#xff0c;那么是否有替代的资源呢&#xff0c;答案是肯定的&#xff0c;而且这个网站的所有者大家都非常的熟悉——Esri&#xff0c;该网站名为World Imagery Wayback&#xff0c;这…

【模型↔关系思考法】如何在一个全新的、陌生的领域快速成为专家?模仿 + 一万小时定律 + 创新...

核心基础:形成模型 行业特性,行业名词术语(模型),行业前规则,行业风险 首先搞懂行业内独有的一些专业名词术语(建立“模型”)的含义,这些是基础。 比如餐饮行业的翻台率、开台率,电商的GMV、SKU、SPU; 通过互联网文章,网站,了解行业的趋势和动向、竞品分析等。 了…

NSS_Round#7部分wp

Web ec_RCE 源码: <!-- A EZ RCE IN REALWORLD _ FROM CHINA.TW --> <!-- By 探姬 --> <?PHPif(!isset($_POST["action"]) && !isset($_POST["data"]))show_source(__FILE__);putenv(LANGzh_TW.utf8); $action $_POST["a…

Jenkins入门(二)Jenkins安装及自动构建部署

一、安装环境 1. 机器要求&#xff1a; 256 MB 内存&#xff0c;建议大于 512 MB 10 GB 的硬盘空间&#xff08;用于 Jenkins 和 Docker 镜像&#xff09; 需要安装以下软件&#xff1a; Java 8 ( JRE 或者 JDK 都可以) 2. 安装JDK 检索可用包 yum search java|grep jd…

Java之JDBC-ResultSet(结果集)

之前的dml语句都返回值都是int表示有改动的行数 那么Select可是要展示数据的 SELECT查询的结果 通过这个ResultSet遍历 然后通过next方法来一行行读取数据 类似于迭代器(肯定不是迭代器) 里面还包含获得的数据元素 相当于这个既包含元素&#xff0c;还能迭代自己的元素 具体你…

[Vulnhub] DC-5

下载链接&#xff1a;https://download.vulnhub.com/dc/DC-5.zip 同DC-4 这个靶机也是只有一个flag 不过官方描述说这个可能提高了一点点难度 官方描述&#xff1a; 据我所知&#xff0c;只有一个可利用的入口点可以进入&#xff08;也没有 SSH&#xff09;。这个特定的入口点…

RocketMQ 原理介绍及详细安装教程

一、为什么选择RocketMQ Apache RocketMQ 自诞生以来&#xff0c;因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨&#xff0c;RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案&#xff0c;被广泛…

python使用pywin32库将ppt导出为高清图片

python使用pywin32库将ppt导出为高清图片 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、安装库 需要安装pywin32库 pip install pywin32二、代码原理 WPS高清图片导出需要会…

Fisco Bcos区块链四(WeBase结点前置服务)

文章目录区块链开荒技术文档&#xff1a;https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html5、WeBASE节点前置服务1、前提条件2、拉取代码3. 编译代码4. 修改配置&#xff08;1&#xff09;进入dist目录&#xff08;2&#xff09;进入conf目录复制配置…

一些常见代码如from __future__ import ...的功能

1. 有一些代码在一开始会通过from __future__ import...导入模块。 __future__是什么&#xff1f; 随着python版本的升级&#xff0c;一些功能也会产生变化&#xff0c;__future__中包括了一些新版本的功能&#xff0c;通过导入__future__中的模块&#xff0c;可以在旧pyth…

IPSec

IPSec是网际层实现IP分组端到端安全传输的机制&#xff0c;由一组安全协议组成。 鉴别首部&#xff08;Authentication Header&#xff0c;AH&#xff09;和封装安全净荷&#xff08;Encapsulating Security Payload&#xff0c;ESP&#xff09;是其中两个协议&#xff0c;AH和…