首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当代码被R8缩小时,安卓生命周期观察者不会触发

的原因是R8是一种用于Android应用程序的代码缩减工具。它通过删除未使用的代码和优化代码结构来减小应用程序的大小,从而提高应用程序的性能和加载速度。

在Android开发中,生命周期观察者是一种设计模式,用于监测和响应Android组件(如Activity、Fragment)的生命周期事件。通过注册生命周期观察者,开发人员可以在组件的生命周期事件发生时执行特定的操作,例如在Activity创建时初始化数据,在Activity销毁时释放资源等。

然而,当代码被R8缩小时,可能会导致一些问题,其中之一就是生命周期观察者不会触发。这是因为R8的代码缩减过程可能会删除一些与生命周期观察者相关的代码,或者对代码进行了重构,导致观察者无法正确注册或被正确调用。

为了解决这个问题,开发人员可以采取以下措施:

  1. 检查R8的配置:确保R8的配置文件中没有排除或优化掉与生命周期观察者相关的代码。可以通过检查R8的配置文件(通常是proguard-rules.pro)来确认。
  2. 显式注册观察者:在代码中显式注册生命周期观察者,而不是依赖于自动注册机制。通过在组件的onCreate方法中手动注册观察者,可以确保观察者能够正确地被调用。
  3. 使用其他代码缩减工具:如果R8无法满足需求,可以尝试其他代码缩减工具,如ProGuard。这些工具可能具有不同的优化策略,可能会更好地保留与生命周期观察者相关的代码。

需要注意的是,以上解决方案是一般性的建议,具体的解决方法可能因应用程序的具体情况而异。在实际开发中,开发人员应该根据具体情况进行调试和优化,以确保生命周期观察者能够正常触发。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

LiveData 还有学习的必要吗?—— Jetpack 系列(2)

宿主生命周期进入消亡(DESTROYED)状态时,LiveData 会自动移除观察者,避免内存泄漏; 2、安全地回调数据: 在宿主生命周期状态低于活跃状态(STAETED)时,LiveData 不会回调数据...,避免产生空指针异常或不必要的性能损耗;宿主生命周期不低于活跃状态(STAETED)时,LiveData 会重新尝试回调数据,确保观察者接收到最新的数据。...而观察者的持有的初始版本号是 -1,因此注册新观察者并且正好宿主的生命周期是大于等于可见状态(STARTED)时,就会尝试分发数据,这就是数据重放。...这样的话,观察者收到重放的数据时,由于其中的标记位已经显示消费,因此会抛弃该事件。...---- 参考资料 LiveData 概览[12] —— 官方文档 重学:吃透 LiveData 本质,享用可靠消息鉴权机制[13] —— KunMinX 著 重学:LiveData 数据倒灌

3.6K10

从 Android 开发到读懂源码 第04期:LiveData 源码解析

作者简介 罗铁锤,六年踩坑经验,致力于底层平台、上层应用等多领域开发。文能静坐弹吉他,武能通宵写代码。...正如注释所说,LiveData 是一个数据持有容器,并且该容器可以感知生命周期的变化,在合适的时机通知观察者数据的变更。...,具备感知生命周期触发外部回调的功能 // 生命周期感知也是一种观察者模型 LifecycleBoundObserver wrapper = new LifecycleBoundObserver...setValue 和 postValue 接着,如果我们需要改变 LiveData 中的数据时,只需调用其 setValue 或者 postValue 方法: // 缓存数据对象,保证编译中不会重排...,内部就是一个典型的观察者模型,主要核心是在通知观察者的过程中引入了生命周期的感知,对于处于激活状态的 observer 才进行通知更新, observer 从非激活到激活状态也会收到通知。

47120
  • kotlin 和 r8 的量子纠缠 | 类加载机制偷鸡

    另外工程内有一部分代码使用了kotlin-reflect的能力,而kotlin-reflect很多能力都是通过读取元数据来完成的。...但是我们在release混淆包中,这部分kotlin 1.7.10生成出来的元数据竟然R8代码优化掉了,导致了release包的部分功能异常。...上图就是类的生命周期了,类加载机制有个特性,如果当前的ClassLoader内已经加载过这个类则后续就会使用这个类去完成构造,当然如果不存在则会去挂载jar,然后从jar中去构造出。...当然我们一般在写的时候很少会出现加载两个不同版本的jar的情况,但是这个在Gradle编译中是允许的,所以先后加载jar的顺序就决定了我们会使用哪个版本的jar。...而R8因为了其中有中间层的特殊性,所以可以比较容易的替换成另外一个版本。 总结 全TM是坑啊,其实还有好几个问题我都没说。只能说世事无常大肠包小肠。

    66220

    【译】LiveData三连

    When and why to use Android LiveData 差不多一年前(2017年5月的第一个alpha版本),谷歌发布了 "架构组件",这是一个库的集合,旨在帮助开发人员设计更强大...视图模型返回LiveData,它是一个可观察的类,从而使我们的Activity成为观察者。就像基于事件的解决方案一样,数据改变时,我们会相应地改变用户界面。...在我们的代码中,我们究竟应该在哪里触发ViewModel数据的加载。有许多可能的选择,但让我们看一下其中的几个。 两年多前,为了改善我们开发应用程序的方式,架构组件引入到Android世界。...这一部分很清楚,不会引起太多的讨论,但是ViewModel必须在某个时候加载、订阅或触发其数据的加载。问题是,这应该在什么时候进行。...这篇文章的灵感来自于18年开发峰会上的一个演讲,我觉得这个演讲很新颖,很有趣。 1. You have backpressure in your app.

    1.7K20

    《QQ音乐小电台》小程序开发

    前端异常上报,小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并返回错误信息,获取设备信息,方便后期定位问题 音乐播放控制bug&fix 下,暂停不能继续播放的问题 原因是暂停再播放时...IOS、播放暂停切歌 IOS,机下播放过程中先暂停在切换歌曲,发现播放的歌曲为原先的歌曲。...同步播放状态 机下播放一首歌曲且同时打开新页面(播放页),同步上一页面播放态,wx.getBackgroundAudioPlayerState在有歌曲播放的情况下status返回为2,且状态返回...仅小程序在后台运行超过一定时间未被唤起、或者用户手动在小程序的控制栏里点击退出程序、或者小程序内存占用过大关闭时,小程序销毁,会触发app.onUnload事件。...5、列表渲染 wx:key 数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。

    4.7K10

    推荐⼀款超好⽤的UI⾃动化⼯具: UiAutomator2!

    1、 导读 做过Android自动化测试的同学想必都知道,最开始用的UiAutomator是Google提供的⽤来做⾃动化测试的⼀个Java库,基于Accessibility服务,功能强⼤,但仅...快速开始: 先准备一台开启了开发者选项的手机,连接上电脑,确保执行adb devices可以看到连接上的设备。...force-stop com.im.qq')) # 回调说明 def click_callback(d: u2.Device): d.xpath("确定").click() # 在回调中调用不会再次触发...是否已经触发过 d.watcher("watcher_name").triggered d.watchers.triggered 当你使用方式一时,在你不想使用它的时候,需要使用d.watchers.watched...= False手动关闭;当然,你也可以使用下方的remove方法移除某个watcher,如此它便不会再生效,使用d.watchers.run(),则与方法一不同,它是在这条命令执行的瞬时启动一次,结束后便不会触发

    81110

    字节跳动Android校招面试

    一面 手写链表逆序 下面代码最后会改变s值么,为什么?java调用函数时候到底是传地址还是传值? String s = "abc" change(s) s = ?...二面 两个算法题:①二叉树某一层有多少个节点②数组中找到重复元素 Android生命周期,onPause和onStop具体说下怎么调用,调用一个透明的activity,生命周期怎么变?...责任链模式 中哪些地方地方用到了观察者模式? 现在手机要下载视频,你该怎么设计,需要考虑哪些因素?下载后的回调函数该放在子线程还是主线程中?...三面 算法题:n个长为n的有序数组,求最大的n个数 介绍下做过最有价值的项目 ANR说一下,怎么找ANR发生的位置 OOM遇到过么,怎么确认位置 技术上的最大突破 MVVM和 MVP 有关注最新的Android...平常怎么学习的,对头条的看法,为什么投 最后又扯了挺多自己目前在搞的推荐算法,用户画像啥的 大概就这些了,二面面完感觉自己要挂了,算法题没写好,自定义view设计不会,没想到竟然过了。

    1.6K20

    开工!今天撸一波Jetpack下的Lifecycle、ViewModel和LiveData

    2.1 Event 一个Event代表Android 生命周期的对象的生命周期发生改变时候,会触发的一个生命周期事件(例如一个activity正在被恢复)。...② ON_CREATE:创建LifecycleOwner(下面会讲这个类)时将触发此事件。 ③ ON_DESTROY:LifecycleOwner销毁时将触发此事件。...② removeObserver():可以调用此方法从Lifecycle的观察者列表中删除给定的观察者。从生命周期中删除观察者将不再接收任何触发事件。...所持有的,那么这个网络请求更新的数据就不会通知给Activity A。...② 简化对没用数据的清理:Activity/Fragment负责清理数据的操作时,需要使用大量代码来清理这些请求。

    1.6K10

    KMS 在腾讯云的微服务实践助力其降本50%

    客户在游戏场景的不同的客户端主要包括,iOS,Web等。此外,客户后端又分为战斗系统、管理系统、用户系统等。...游戏业务通常都有波峰波谷,在业务高峰期的时候需要快速扩容来支持大量的游戏玩家;在业务低峰期的时候,需要容来节约成本。...整体设计 游戏业务通常都有各种客户端,比如、iOS、网页等,为了应对不同的场景,架构设计上也应该有一定的区别。 首先,必须有 CDN 来提供静态文件的分发,包括游戏资源、安装包、图片等。...因为 KMS 是使用的GitHub,所以在代码提交后,就会自动触发GitHub Actions运行测试、构建、上传等操作,实现自动打包构建镜像等,最后 CD 流程会把构建好的镜像部署到弹性微服务中去。...同时,此过程已经 KMS 集成到自动化流程中,每天自动触发了。 另外,在 App Service 之前若有实例存在内存问题时,需要重启。一般都需要1个小时左右。

    27110

    KMS 在腾讯云的微服务实践助力其降本50%

    客户在游戏场景的不同的客户端主要包括,iOS,Web 等。此外,客户后端又分为战斗系统、管理系统、用户系统等。...游戏业务通常都有波峰波谷,在业务高峰期的时候需要快速扩容来支持大量的游戏玩家;在业务低峰期的时候,需要容来节约成本。...2.1 整体设计 游戏业务通常都有各种客户端,比如、iOS、网页等,为了应对不同的场景,架构设计上也应该有一定的区别。 首先,必须有 CDN 来提供静态文件的分发,包括游戏资源、安装包、图片等。...因为 KMS 是使用的GitHub,所以在代码提交后,就会自动触发GitHub Actions运行测试、构建、上传等操作,实现自动打包构建镜像等,最后 CD 流程会把构建好的镜像部署到弹性微服务中去。...同时,此过程已经 KMS 集成到自动化流程中,每天自动触发了。 另外,在 App Service 之前若有实例存在内存问题时,需要重启。一般都需要1个小时左右。

    32630

    Android内存泄漏原因

    一、Android内存泄漏的本质原因 我们经常看到的说法是,内存泄漏是因为长生命周期的对象持有了短生命周期的引用导致本应该本回收的内存无法回收 但是什么是长生命周期呢,正常我们知道单例、Application...另外有一些三方库需要传Context的时候,需要慎重选择传入的Context的生命周期,原则就是取短不取长。...ArrayList、HashMap、LinkList或者容器类里面保存Fragment的时候,Fragment要被销毁掉,但是ArrayList持有,ArrayList又被Activity持有,就导致...,不会主动退出,而活跃的线程是GCRoot根,这就导致了Handler方法里面引用在线程死掉之前都不会被释放的。...我们知道Eventbus是通过观察者模式来实现消息传递的,我们在register的时候传入的Activity就是观察者,最终会被保存在一个static的Map中,Eventbus接收到消息的时候,会遍历所有观察者匹配参数类型发送消息

    88120

    开发以太坊钱包系列3 - 资产信息展示

    这是如何开发以太坊()钱包系列第3篇, 钱包账号资产信息展示,展示信息主要包括账号地址、eth余额及该账号所拥有的Token及余额。...或Fragment使用,界面系统销毁时,ViewModel也会进行资源清理,避免内存泄漏。...观察者可以方便我们以异步的方式获取数据,同时LiveData也是有生命周期感知的。如果其生命周期处于STARTED或RESUMED状态。LiveData会将观察者视为活动状态,并通知其数据的变化。...LiveData未注册的观察对象以及非活动观察者不会收到有关更新的通知。 了解更多,可自行以关键字: Lifecycle、ViewModel、LiveData 进行搜索。...PropertyFragment.java 中, 就可以对 defaultWallet 进行订阅: tokensViewModel.defaultWallet().observe(this, this::showWallet); 获取到默认账号时

    1.3K30

    Android: RxJava操作符 详细使用手册

    本系列文章主要基于 Rxjava 2.0 接下来的时间,我将持续推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的开发笔记...本文所有代码 Demo均存放在Carson_Ho的Github地址 目录 1. 简介 RxJava 操作符的具体简介如下: 2....(Observable) & 合并需要发送的事件 应用场景 组合多个观察者 合并多个事件 发送事件前追加发送事件 统计发送事件数量 类型 根据上述应用场景,常见的组合 / 合并操作符 主要有:...(Observable) 在发送事件时实现一些功能性需求 实际应用场景 连接(订阅) 观察者 & 观察者 线程调度(切换) 错误处理 事件生命周期操作 延时操作 重复发送操作 类型 根据上述应用场景...中常用的所有类型操作符进行了详细介绍,下面用1张图进行总结 接下来的时间,我将持续推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的开发笔记

    1.5K20

    关于RxJava的基础心法解析

    2017年Kotlin语言Google举行的I/O开发者大会上宣布,将Kotlin语言作为开发的一级编程语言,所以自己又看了看了Kotlin语言。...之前想不到RxJava的使用场景是因为自己见的、写的代码还不够多。 今天回过头来从代码的角度看看一次RxJava 的基础操作,事件订阅到触发的过程。...Java的观察者模式 观察者:Observer 观察者:Observable 观察者提供添加(注册)观察者的方法; 观察者更新的同时可以主动通知注册它观察者更新; 观察者模式面向的需求是:...收音机听广播,电台是观察者,收音机是观察者。...谁触发观察者 我们进行了 subscribe 之后就会触发 Observable 的执行动作,然后将执行结果传输给订阅它的 Subscriber 。

    43210

    Android:这是一篇 清晰 易懂的Rxjava 入门教程

    上增加了一些新特性,本质原理 & 使用基本相同 3、接下来的时间,我将持续推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的开发笔记...基本使用 本文只关注 RxJava的基本使用,更深入的RxJava使用请继续关注Carson_Ho的开发笔记 Rxjava的使用方式有两种: 分步骤实现:该方法主要为了深入说明Rxjava的原理 &...Observable 订阅时,OnSubscribe 的 call() 方法会自动调用,即事件序列就会依照设定依次触发 // 即观察者会依次调用对应事件的复写方法从而响应事件...// 从而实现被观察者调用了观察者的回调方法 & 由观察者观察者的事件传递,即观察者模式 // 同时也看出:Observable只是生产事件,真正的发送事件是在它被订阅的时候,即...的入门知识进行讲解,包括基本介绍、原理 & 具体使用等 接下来,我将持续推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的开发笔记

    83510

    Android RxJava操作符详解 系列:功能性操作符

    本系列文章主要基于 Rxjava 2.0 接下来的时间,我将持续推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的开发笔记...// 从而实现被观察者调用了观察者的回调方法 & 由观察者观察者的事件传递,即观察者模式 // 同时也看出:Observable只是生产事件,真正的发送事件是在它被订阅的时候,即 subscribe...retry() 作用 重试,即出现错误时,让观察者(Observable)重新发射数据 接收到 onError()时,重新订阅 & 发送事件 Throwable 和 Exception都可拦截...(1); // 仅仅是作为1个触发重新订阅观察者的通知,发送的是什么数据并不重要,只要不是Complete() / Error()事件...下面我将继续对RxJava2的其他操作符进行深入讲解 ,有兴趣可以继续关注Carson_Ho的开发笔记 ---- 请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

    1.1K10

    LiveData详细分析

    LiveData需要一个观察者对象,一般是Observer类的具体实现。观察者生命周期处于STARTED或RESUMED状态时,LiveData会通知观察者数据变化。...在这种情况下,对应的生命周期对象DESTORY时,才能移除观察者。...不会发生内存泄露 观察者被绑定到组件的生命周期上,被绑定的组件销毁(onDestroy)时,观察者会立刻自动清理自身的数据。...组件recreate,数据还是存在LiveData中,并不会被销毁。...看一下源代码 将给定的观察者添加到观察者列表中,意味着给定的观察者将接收所有事件,并且永远不会被自动删除,不管在什么状态下都能接收到数据的更改通知@MainThread public void observeForever

    2.9K00

    这是一篇清晰易懂的 Rxjava 入门教程

    上增加了一些新特性,本质原理 & 使用基本相同 接下来的时间,我将持续推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的开发笔记...基本使用 本文只关注 RxJava的基本使用,更深入的RxJava使用请继续关注Carson_Ho的开发笔记 Rxjava的使用方式有两种: 分步骤实现:该方法主要为了深入说明Rxjava的原理 &...Observable 订阅时,OnSubscribe 的 call() 方法会自动调用,即事件序列就会依照设定依次触发 // 即观察者会依次调用对应事件的复写方法从而响应事件...// 从而实现被观察者调用了观察者的回调方法 & 由观察者观察者的事件传递,即观察者模式 // 同时也看出:Observable只是生产事件,真正的发送事件是在它被订阅的时候,即...的入门知识进行讲解,包括基本介绍、原理 & 具体使用等 接下来,我将持续推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的开发笔记

    6.7K71

    Android:手把手带你入门神秘的 Rxjava

    上增加了一些新特性,本质原理 & 使用基本相同 接下来的时间,我将持续推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的开发笔记...基本使用 本文只关注 RxJava的基本使用,更深入的RxJava使用请继续关注Carson_Ho的开发笔记 Rxjava的使用方式有两种: 分步骤实现:该方法主要为了深入说明Rxjava的原理...Observable 订阅时,OnSubscribe 的 call() 方法会自动调用,即事件序列就会依照设定依次触发 // 即观察者会依次调用对应事件的复写方法从而响应事件...// 从而实现被观察者调用了观察者的回调方法 & 由观察者观察者的事件传递,即观察者模式 // 同时也看出:Observable只是生产事件,真正的发送事件是在它被订阅的时候,即...的入门知识进行讲解,包括基本介绍、原理 & 具体使用等 接下来,我将持续推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的开发笔记

    62140
    领券