Simple BusProvider.getInstance().post() apporter exception pas thread principal. Comment faire pour envoyer un événement de Service à l'Activité avec Otto bus d'événement?
Réponses
Trop de publicités?De post à partir de n'importe quel thread principal (arrière-plan) et de recevoir sur le thread principal, essayez quelque chose comme
public class MainThreadBus extends Bus {
private final Bus mBus;
private final Handler mHandler = new Handler(Looper.getMainLooper());
public MainThreadBus(final Bus bus) {
if (bus == null) {
throw new NullPointerException("bus must not be null");
}
mBus = bus;
}
@Override public void register(Object obj) {
mBus.register(obj);
}
@Override public void unregister(Object obj) {
mBus.unregister(obj);
}
@Override public void post(final Object event) {
if (Looper.myLooper() == Looper.getMainLooper()) {
mBus.post(event);
} else {
mHandler.post(new Runnable() {
@Override public void run() {
mBus.post(event);
}
});
}
}
Remarque: le crédit va à Jake Wharton et "pommedeterresaute" à https://github.com/square/otto/issues/38 pour l'approche générale. J'ai juste mis en oeuvre avec une classe wrapper plutôt qu'une sous-classe.
De post à partir de n'importe quel thread principal (arrière-plan) et de recevoir sur le thread principal, utilisez la commande suivante MainThreadBus
, au lieu de la vanille, Bus
public class MainThreadBus extends Bus {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override public void post(final Object event) {
if (Looper.myLooper() == Looper.getMainLooper()) {
super.post(event);
} else {
handler.post(new Runnable() {
@Override
public void run() {
MainThreadBus.super.post(event);
}
});
}
}
}
Ceci est basé sur Andy Dennie de réponse.
Il n'est pas nécessaire à la fois d'étendre et d'emballer Bus
objet, procédez de l'une ou de l'autre. Dans Dennie réponse, qui est effectivement un wrapper, l' Bus
classe de base est tout simplement être utilisé comme une interface, toutes les fonctionnalités sont écrasées.
Il serait encore si vous avez supprimé l' Bus
classe de base, sauf si il vous est arrivé de référence de l' MainThreadBus
via un Bus
de référence.