¿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?
- Android Event Bus Alternative
- ¿Hay ventajas para cambiar a Otto de Broadcast events
- Utilizando Otto, el método sólo se suscribe si lo llamo directamente a otra parte
- NullPointerException con Otto y Dagger
- Cancelar el registro de los oyentes en onDestroy - ¿cuál es el daño / pueden tener fugas?
- @Subscribe método llamado tiempo múltiple para el mismo evento
- IllegalArgumentException cuando se utiliza Otto con un fragmento retenido
- ClassNotFoundException: No encontró la clase "android.os.PersistableBundle" Otto Android 5.0
- ¿Qué métodos de ciclo de vida de actividad son los mejores para registrar / anular el registro en el bus de eventos?
- Utilizar Intents o un bus de eventos para comunicarse dentro de la misma aplicación
- Otto / EventBus a través de múltiples procesos
- RuntimeException: No se pudo enviar evento @ otto
- Problema de suscripción de bus de eventos (bus de eventos Otto - Guava)
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.
- ¿Cómo hacer cumplir EditText para comenzar el texto en letra mayúscula?
- Establecer la página predeterminada de ViewPager en Android