2016-04-20 7 views
3

Ich benutze EventBus (GreenRobot), um von backgroundThread zu meiner Aktivität zu posten (was ein UiThread ist). Ich könnte ein Fragment usw. starten. Ich möchte auch meinen Titel aktualisieren, also tat ich wie folgt. (Aufruf der Aktivität setTitle())EventBus Buchung kann Toolbar Title nicht aktualisieren. Irgendeine Problemumgehung?

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

Allerdings gibt es einen Fehler, wie unten angegeben. (Die App ist nicht abgestürzt, aber der Fehler wird deutlich im Protokoll angezeigt und der Titel der Toolbar verhält sich danach merkwürdig).

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) 

Gibt es eine Weise, die ich es umgehen könnte, wo die Post von EventBus noch erlauben kann mir meine Ui (zum Beispiel Titel) zu aktualisieren?

Antwort

14

Sie können nur alle UI-Komponenten aus dem UI-Thread aktualisieren. Wenn Sie versuchen, die Benutzeroberfläche aus dem Hintergrund-Thread zu aktualisieren, funktioniert sie nicht und kann zum Absturz der App führen.

Standardmäßig wird @Subscribe Methode im Buchungsthread ausgeführt, die Ihr Hintergrundthread ist. Deshalb funktioniert dein Code nicht. Damit es funktioniert, müssen Sie @Subscribe(threadMode = ThreadMode.MAIN) verwenden, damit es im UI-Thread ausgeführt wird. Für Ihren spezifischen Code:

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