首页 > 解决方案 > 基于 API 级别的 GreenRobot EventBus 订阅

问题描述

我正在尝试订阅 EventBus 事件。由于 API 级别 23 及以下级别中不存在父类,我处于需要有条件地订阅所述事件的情况。

我意识到,通过使用构建变体,可以解决这个问题,但我很好奇是否有更优雅的解决方案。@RequiresApi注释似乎没有任何效果(也许堆叠注释不能按我期望的方式工作)。

一些简化的示例代码:

class MyClass : OtherClass() {
    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onSomeEvent(someEvent: SomeEvent) {
        // do some stuff
    }
}

假设OtherClass()仅在 API 级别 24+ 中可用,则应用程序将在 Dalvik 或 ART 意识到生成的EventBusIndex引用损坏的类之后立即挂在较低 API 级别的启动屏幕上。

标签: androidkotlinannotationsgreenrobot-eventbus

解决方案


您可以尝试进行MyClass一些调整以将订阅移动到另一个对象:

class MyClass : OtherClass() {
    val subber = Subber()

    fun onSomeEventForRealz(someEvent: SomeEvent) {
        // do some stuff
    }

    inner class Subber {
        @Subscribe(threadMode = ThreadMode.MAIN)
        fun onSomeEvent(someEvent: SomeEvent) = onSomeEventForRealz(someEvent)
    }
}

您还需要调整您的subscribe()unsubscribe()调用以传递subber而不是MyClass实例本身。


推荐阅读