EventBus发布无法更新工具栏标题。任何解决方法?

时间:2016-04-20 13:32:36

标签: android android-activity greenrobot-eventbus

我使用EventBus(GreenRobot)从backgroundThread发布到我的活动(这是一个UiThread)。我可以开始片段等。我也想更新我的标题,所以我做了如下。 (调用Activity setTitle())

@Subscribe
public void onEvent(AuthenticationEvent event) {
    setTitle(event.getTitle());
}

但是,如下所示,存在错误。 (该应用程序没有崩溃,但错误清楚地显示在日志中,并且工具栏标题在此之后表现得很奇怪。)

E/EventBus: Could not dispatch event: class package.AuthenticationEvent to subscribing class class package.MainActivity
      android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)

有没有办法解决它,EventBus的帖子仍然允许我更新我的Ui(例如标题)?

2 个答案:

答案 0 :(得分:15)

您只能从UI线程更新任何UI组件。如果您尝试从后台线程更新UI,它将无法工作,并可能导致应用程序崩溃。

默认情况下,@Subscribe方法将在发布主题中执行,这是您的后台主题。这就是你的代码不起作用的原因。要使其工作,您必须使用@Subscribe(threadMode = ThreadMode.MAIN),以便它将在UI线程中执行。对于您的特定代码:

// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(AuthenticationEvent event) {
    setTitle(event.getTitle());
}

答案 1 :(得分:3)

使用@Subscribe(threadMode = ThreadMode.MAIN)代替@Subscribe。请参阅the delivery threads/thread mode documentation