我使用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(例如标题)?
答案 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。