【问题标题】:EventBus with Kotlin not working带有 Kotlin 的 EventBus 无法正常工作
【发布时间】:2017-08-01 12:29:05
【问题描述】:

我是 Android 新手,正在尝试使用 EventBus 将消息从 Fragment 发送到其容器 Activity。 但是,我收到错误:

D/EventBus: No subscribers registered for event class com.app.todo.controllers.task.TaskListFragment$TaskCreateSelectEvent

以下是Activity类中与EventBus相关的代码:

public class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onTaskCreateSelectEvent(event: TaskListFragment.TaskCreateSelectEvent) {
        Log.d("TAG", "On Main Activity")
    }

    fun addFragment(fragment: Fragment) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit)
        transaction.add(R.id.task_fragment_container, fragment)
        transaction.addToBackStack(fragment.javaClass.simpleName)
        transaction.commit()
    }

    public override fun onStart() {
        super.onStart()
        EventBus.getDefault().register(this)
    }

    public override fun onStop() {
        super.onStop()
        EventBus.getDefault().unregister(this)
    }

}

以下是Fragment类

public class TaskListFragment : Fragment() {
    private var fab: FloatingActionButton? = null

    public class TaskCreateSelectEvent {
        var fab: FloatingActionButton? = null
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        var view = inflater!!.inflate(R.layout.task_list_fragment, container, false)
        fab = view.findViewById<FloatingActionButton>(R.id.fab)
        fab!!.setOnClickListener {
            val selectEvent = TaskCreateSelectEvent()
            EventBus.getDefault().post(selectEvent)
        }
        return view
    }
}

这是在build.gradle 文件中添加库的方式。

apply plugin: 'kotlin-kapt'

dependencies {
    compile 'org.greenrobot:eventbus:3.0.0'
    kapt 'org.greenrobot:eventbus-annotation-processor:3.0.1' }

kapt {
    arguments {
        arg('eventBusIndex', 'com.app.todo.controllers.MyEventBusIndex')
    } 
}

知道我做错了什么吗?

【问题讨论】:

  • 你在哪里调用addFragment方法?
  • addFragment 尚未调用。我曾计划调用它来添加更多片段。但目前,卡在获取事件。
  • 我只是想澄清一下任务列表片段是否附加到活动。你的代码看起来不错,我自己试过了
  • 我实际上是通过 .xml 文件添加了 Fragment。连我自己都不知道原因。
  • 我运行了你的代码,它工作正常。

标签: android kotlin greenrobot-eventbus-3.0


【解决方案1】:

我是 Android 新手...

那么你最好熟悉 dagger 和 rx。 事件总线在 android 上是一个坏事,并且经常使事情变得比必要的更复杂。

https://www.google.de/search?q=android+rxjava+instead+of+eventbus

【讨论】:

  • 感谢您分享您的想法。甚至我也计划使用 rx,但只是想为使用 EventBus 的应用程序制作一个快速 MVP,因为它看起来很简单。
【解决方案2】:

尝试将您订阅的方法名称更改为:

    onMessageEvent(event: TaskListFragment.TaskCreateSelectEvent)

但正如@Lord Flash 所建议的那样 - 使用 rxjava 而不是 eventbus。看看PublishSubject/PublishProcessor (rx 2.0) 类

【讨论】:

  • 感谢您的回复。我试过这个,但效果不佳。不过,我会尝试 rx 的东西。
  • 方法名和事件有什么关系?因为事件是根据方法参数识别的。