58 votes

Comment faire pour envoyer un événement de Service à l'Activité avec Otto bus d'événement?

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?

122voto

Andy Dennie Points 2353

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.

20voto

alexbirkett Points 234

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X