EventBus搭配LifeCycle可能更美味

2024-09-01 15:44

本文主要是介绍EventBus搭配LifeCycle可能更美味,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简要介绍

EventBus:一个用来在组件之间发通知通信的开源库。

LifeCycle:JetPack库中一个能感知生命周期的组件。

Kotlin扩展函数:可以为已经存在的类添加新的方法的黑魔法。

解决的问题

在使用EventBus时,我们每次在需要接受通知的地方,都需要注册解绑监听函数。类似下面的模板代码:

@Override
protected void onStart() {super.onStart();EventBus.getDefault().register(this);
}@Override
protected void onStop() {super.onStop();EventBus.getDefault().unregister(this);
}

如果忘记了unregister函数,可能就会造成内存泄露空指针等奇怪问题。当这个类不需要通知监听时,删除也挺麻烦的。所以很多人可能投向了LiveDataBus的怀抱。

那么将EventBusLifeCycle搭配上了,注册函数可以怎么写呢?

//Activity|Fragment,所有实现了LifecycleOwner的类
EventBus.getDefault().registerOnStart(this);

这就简单多了,对吧!有点LiveDataBus那味了。上面的函数会在onStart生命周期函数中自动注册EventBus监听,并在onStop生命周期函数中自动解绑监听。

可用方法

//生命周期注册监听
EventBus.getDefault().registerOnStart(lifecycleOwner);
EventBus.getDefault().registerOnStart(lifecycleOwner);
EventBus.getDefault().registerOnStart(lifecycleOwner);
//安全调用注册/解绑
EventBus.getDefault().safeRegister(obj);
EventBus.getDefault().safeUnregister(obj);

实现思路

给EventBus添加扩展函数

/*** 在onCreate中注册事件,自动在onDestroy中注销事件*/
fun <span><span><span>&lt;</span>T</span> <span>:</span> <span>LifecycleOwner</span><span>&gt;</span></span> EventBus.registerOnCreate(owner: T) {if (this.isRegistered(owner)) returnowner.lifecycle.addObserver(OnCreateLifecycleObserver(this, owner))
}

实现OnCreateLifecycleObserver

class OnCreateLifecycleObserver<span><span><span>&lt;</span>T</span><span>&gt;</span></span>(private val eventBus: EventBus,private val owner: T
) : LifecycleObserver {}

在对应的生命周期函数中添加注册\解绑函数

class OnCreateLifecycleObserver<span><span><span>&lt;</span>T</span><span>&gt;</span></span>(private val eventBus: EventBus,private val owner: T
) : LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)fun onCreate() {if (eventBus.isRegistered(owner)) returneventBus.register(owner)}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)fun onDestroy() {if (!eventBus.isRegistered(owner)) returneventBus.unregister(owner)}
}

LifeCycle不怎么会的可以直接看官方文档,使用还是蛮简单。

其他生命周期实现类似,具体可看源码实现。

源码

https://github.com/simplepeng/NiceKTX

这篇关于EventBus搭配LifeCycle可能更美味的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127367

相关文章

找出php中可能有问题的代码行

前言 当你发现一个平时占用cpu比较少的进程突然间占用cpu接近100%时,你如何找到导致cpu飙升的原因?我的思路是,首先找到进程正在执行的代码行,从而确定可能有问题的代码段。然后,再仔细分析有问题的代码段,从而找出原因。 如果你的程序使用的是c、c++编写,那么你可以很容易的找到正在执行的代码行。但是,程序是php编写的,如何找到可能有问题的代码行呢?这个问题就是本文要解决的问题。 背景

颠覆你的开发模式:敏捷思维带来的无限可能

敏捷软件开发作为现代软件工程的重要方法论,强调快速响应变化和持续交付价值。通过灵活的开发模式和高效的团队协作,敏捷方法在应对动态变化和不确定性方面表现出色。本文将结合学习和分析,探讨系统变化对敏捷开发的影响、业务与技术的对齐以及敏捷方法如何在产品开发过程中处理持续变化和迭代。 系统变化对敏捷软件开发的影响 在敏捷软件开发中,系统变化的管理至关重要。系统变化可以是需求的改变、技术的升级、

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

力扣 797. 所有可能路径【DFS】

1. 题目 2. 代码 DFS , 直接见代码 class Solution {public:vector<int> path;vector<vector<int>> res; // 结果集void dfs(vector<vector<int>>& graph, int cur, int n){// 找出所有从节点 0 到节点 n-1 的路径// 下标从 0 开始的if (

Android Jetpact Lifecycle 解析

认识 Lifecycle Lifecycle 是什么 Lifecycle 是 Jetpack 组件库中的一个生命周期感知型组件。在 Lifecycle 出现之前,需要手动从外部宿主(如 Activity、Fragment 或自定义宿主)中将生命周期事件分发到功能组件内部,这势必会造成宿主代码复杂度增加。有了 Lifecycle 的存在,搭建依赖于生命周期变化的业务逻辑变得简单高效,可以用一种统

你读文献的方式可能错了!掌握这些技巧,让阅读事半功倍!

我是娜姐 @迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 科研新手如何精读一篇论文? 很多科研新手,一上来就疯狂下载几十上百篇文献。囫囵吞枣看完了,还是什么都不知道,大脑一片空白。究竟该如何读文献收获最大? 大佬说,要积极阅读、频繁阅读。 什么是积极阅读? 相比被动阅读,积极阅读是指在阅读之前准备好问题、设置阅读目标、保持批判性,收获更多、进步更大的一种阅读

机器人可能会在月球上提供帮助

登月是我们这个时代最具标志性的事件之一,这可能还算轻描淡写了:这是我们迄今为止在物理上探索得最远的一次。我听过一些当时的老广播,它们可以让你想象出这次航行的重要性。 现在,研究人员表示,我们可能很快就能重返月球,甚至可能很快就会有人类任务前往火星。 火星。艺术家:NASA 这次会有什么不同呢? 有一点是确定的:机器人将大力协助—— 非常多。 在麻省理工学院,我们的一些团队正在开发突破性的

构建现代API:FastAPI中Query与Body参数的最佳搭配

在FastAPI中,Query 和 Body 是两种不同的依赖注入器,它们的应用场景取决于你的具体需求。以下是它们各自常见的使用场景: Query 参数 使用场景: 当你需要从URL中获取一些简单的参数时,例如过滤、排序、分页等。 当数据量不大,且可以作为URL的一部分安全传输时。当数据不需要复杂的结构时。 Body 参数 使用场景: 当你需要发送较为复杂的数据结构时,例如包含多个字段

Python中的方法重写与多态:解锁编程的无限可能

在编程的世界里,灵活性与扩展性往往是衡量一个语言是否强大、易于维护的关键指标。Python,作为一种被广泛使用的高级编程语言,不仅以其简洁易读的语法赢得了众多开发者的喜爱,更因其支持多种面向对象特性而备受青睐。其中,“方法重写”与“多态”便是两个核心概念,它们不仅能够极大地提高代码的复用性和可维护性,还能帮助我们构建更加灵活、健壮的软件系统。本文将通过一系列由浅入深的例子,带你一起探索这两个概念的

深入探讨MySQL联表查询可能导致的问题及应对策略

一、MySQL联表查询的基本概念 在深入探讨问题之前,我们首先回顾一下MySQL联表查询的基本概念。联表查询是指通过某种连接条件,将两个或多个表的数据结合起来进行查询。常见的连接类型包括: INNER JOIN(内连接):返回两个表中满足连接条件的记录。LEFT JOIN(左连接):返回左表的所有记录,即使右表中没有匹配的记录。RIGHT JOIN(右连接):返回右表的所有记录,即使左表中没有