¿Cómo enviar un evento de Servicio a Actividad con el bus de eventos Otto?

Simple BusProvider.getInstance().post() trae la excepción no el main thread . ¿Cómo enviar un evento de Servicio a Actividad con el bus de eventos Otto?

Para publicar desde cualquier hilo (principal o de fondo) y recibir en el hilo principal, pruebe algo como

 public class MainThreadBus extends Bus { private final Handler mHandler = new Handler(Looper.getMainLooper()); @Override public void post(final Object event) { if (Looper.myLooper() == Looper.getMainLooper()) { super.post(event); } else { mHandler.post(new Runnable() { @Override public void run() { MainThreadBus.super.post(event); } }); } } } 

Nota: crédito va a Jake Wharton y "pommedeterresaute" en https://github.com/square/otto/issues/38 para el enfoque general. Acabo de implementarlo con una clase de contenedor en lugar de una subclase.

Para publicar desde cualquier subproceso (principal o de fondo) y recibir en el subproceso principal, utilice el siguiente MainThreadBus lugar de un Bus vainilla

 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); } }); } } } 

Esto se basa en la respuesta de Andy Dennie.

No hay necesidad de extender y envolver un objeto Bus , hacer uno u otro. En la respuesta de Dennie, que es efectivamente un envoltorio, la clase de base Bus sólo se utiliza como una interfaz, toda la funcionalidad se sobrescribe.

Funcionaría incluso si usted quitó la clase base del Bus menos que usted sucediera referenciar el MainThreadBus vía una referencia del Bus .

Bus = nuevo Bus (ThreadEnforcer.ANY); Es la solución clara a este problema. Es todo lo que tienes que hacer.

O simplemente haga esto si está seguro de que está publicando desde un hilo no principal:

 new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { mBus.post(new myEvent()); } }); 

Tal como dice el refrán, "Keep It Simple and Stupid" 🙂

La mejor clase de autobús personalizado para mí

 public class AndroidBus extends Bus { private final Handler mainThread = new Handler(Looper.getMainLooper()); @Override public void post(final Object event) { if (Looper.myLooper() == Looper.getMainLooper()) { super.post(event); } else { mainThread.post(() -> AndroidBus.super.post(event)); } } } 

Simplemente lo hice:

 Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { bus.post(event); } }); 

Feliz codificación

Basta con crear el BasicBus con ThreadEnforcer.NONE para publicar eventos de hilos no principales. El mencionado ThreadEnforcer.MAIN es exactamente lo contrario (y el valor predeterminado), que acepta sólo los mensajes del subproceso principal.

  • Otto lanza "Objeto ya registrado" onResume en viewpager
  • Está utilizando la biblioteca de eventos como Otto o EventBus como una forma recomendada de manejar las relaciones entre Actividades, Fragmentos y subprocesos de fondo
  • Mejores Prácticas para el Manejo de la Búsqueda
  • Model View Presenter con un EventBus, ¿cómo recuperar los eventos en Presenter?
  • Ventajas de inyectar el autobús de eventos de Otto en lugar de usar singleton estático
  • Otto vs LocalBroadcast:
  • Utilizar Otto para actualizar un listadapter de un GcmListenerService
  • Otto eventbus para android se comporta de forma diferente en la versión de lanzamiento
  • Cómo saber si un suscriptor de Otto está registrado
  • Issue Suscribiéndose a / Receiving Otto Event Publicado desde IntentService
  • Evento Otto sin disparos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.