GreenRobot EventBus 订阅基于 API 级别

GreenRobot EventBus subscribe based on API level

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

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

一些简化的示例代码:

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

假设 OtherClass() 仅在 API 级别 24+ 中可用,在 Dalvik 或 ART 意识到生成的EventBusIndex 引用了损坏的 class.

您可以尝试稍微调整 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 实例本身。