当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大模型笔记01--基于ollama和open-webui快速部署chatgpt
  • 51单片机-定时器介绍
  • 模型 冯/诺依曼思维模型
  • 《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(2)
  • 【Java开发】Maven安装配置详细教程
  • python模块06 mock-1基础用法
  • JavaWeb:实验一JSP运行环境安装及配置
  • 5.Redis 集群 主从复制 哨兵
  • Mybatis 是如何进行分页的?分页插件的原理是什么?
  • java构建工具-maven的复习笔记【适用于复习或者初步了解】
  • WebView快速打开
  • 公司招聘中,多个面试官对候选人评价不一致怎么办?
  • class 3: vue.js 3 计算属性
  • Java中的注解(Annotation)
  • MySQL入门学习-MySQL的连接查询
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [数据结构]链表的实现在PHP中
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Akka系列(七):Actor持久化之Akka persistence
  • Android 架构优化~MVP 架构改造
  • django开发-定时任务的使用
  • EOS是什么
  • es的写入过程
  • JAVA之继承和多态
  • Js基础知识(一) - 变量
  • js如何打印object对象
  • mac修复ab及siege安装
  • Mysql5.6主从复制
  • MySQL主从复制读写分离及奇怪的问题
  • Spring Cloud Feign的两种使用姿势
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 代理模式
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 关于使用markdown的方法(引自CSDN教程)
  • 诡异!React stopPropagation失灵
  • python最赚钱的4个方向,你最心动的是哪个?
  • Spring第一个helloWorld
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #1014 : Trie树
  • (¥1011)-(一千零一拾一元整)输出
  • (003)SlickEdit Unity的补全
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (26)4.7 字符函数和字符串函数
  • (day18) leetcode 204.计数质数
  • (TOJ2804)Even? Odd?
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (阿里云万网)-域名注册购买实名流程
  • (层次遍历)104. 二叉树的最大深度
  • (利用IDEA+Maven)定制属于自己的jar包
  • (一)Java算法:二分查找
  • (一)UDP基本编程步骤