EventBus搭配LifeCycle可能更美味

1,409 阅读1分钟

简要介绍

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 <T : LifecycleOwner> EventBus.registerOnCreate(owner: T) {
    if (this.isRegistered(owner)) return
    owner.lifecycle.addObserver(OnCreateLifecycleObserver(this, owner))
}

实现OnCreateLifecycleObserver

class OnCreateLifecycleObserver<T>(
    private val eventBus: EventBus,
    private val owner: T
) : LifecycleObserver {

}

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

class OnCreateLifecycleObserver<T>(
    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不怎么会的可以直接看官方文档,使用还是蛮简单。

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

源码

github.com/simplepeng/…