android - 基于 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 级别的启动屏幕上。
解决方案
您可以尝试进行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
实例本身。
推荐阅读
- javascript - 如何从 CRUD 应用程序中编辑和删除单个项目
- html - 所有屏幕尺寸的响应式 iFrame 高度
- intellij-idea - 使用 JetBrains IntelliJ IDEA 或其他工具的多语言项目
- c# - 尝试调用过程并传递参数获取错误
- jquery - 数据表布局问题 - 按钮和下拉菜单
- python - 将 json 导入 Postgres 时出现编码问题
- r - 使用 r 中的参数模型预测跟进时间
- typescript - 在 WebStorm 2018.2.5 中看不到 TypeScript 工具栏
- javascript - 通过 JSON 移动数据的目的
- ruby-on-rails - 如何在 `select_tag` 中显示特定值?