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

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)) return
    owner.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)) return
        eventBus.register(owner)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
        if (!eventBus.isRegistered(owner)) return
        eventBus.unregister(owner)
    }
}

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

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

源码

https://github.com/simplepeng/NiceKTX


http://www.kler.cn/a/286016.html

相关文章:

  • 鸿蒙(API 12 Beta3版)【访问和管理动态照片资源】Media Library Kit媒体文件管理服务
  • 初试构建工具Webpack
  • 数据结构(顺序表、链式表)
  • 微信小程序App实现小车方向控制
  • Webpack中的自定义 loader 的简单实现
  • Python酷库之旅-第三方库Pandas(113)
  • HarmonOS实战开发:Node-API接口适配模块加载指导
  • HTTP/2
  • 讲个SystemVerilog disable语句的坑
  • js实现3d拖拽环绕旋转
  • 基于Material Design风格开源的Avalonia UI控件库
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【4.1】RK3588训练数据时进行图像增强更多内容见视频
  • 力扣1235.规划兼职工作
  • 大阪OSAKA分子泵电源TC163HTC203TC353TC523TC1104TC553TC1813手侧
  • 地理空间查询的奥秘:SQL中的高效数据探索
  • OpenAI GPT3 Search API not working locally
  • MySQL数据库规范化:避免数据冗余与保持数据一致性
  • Python酷库之旅-第三方库Pandas(114)
  • 5.4二叉树——经典OJ题
  • 【扩散模型(七)】IP-Adapter 与 IP-Adapter Plus 的具体区别是什么?