我正在尝试订阅EventBus事件。由于API级别23及以下版本中不存在父类,因此我需要有条件地预订该事件。

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

一些简化的示例代码:

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

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

最佳答案

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

09-29 22:33