Cómo llamar a las actividades de un hilo no actividad?

Tengo un patrón de diseño de observador que utiliza un hilo para enviar mis propios Events . A veces las clases que se llaman son actividades de Android y otras veces son clases regulares. El código en el subproceso no es una actividad.

Estaba recibiendo este error:

No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()

Para evitar ese error en tiempo de ejecución tuve que agregar Looper.prepare() dentro del hilo. Soy consciente de esta publicación: No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () que contiene la mejor información para este tipo de problema, pero aún no sé cómo integrar la respuesta por mjosh en mi Hilo.


Problema

La llamada del hilo a la actividad nunca sucede. De forma aislada, este código funciona, pero no cuando las actividades están esperando la llamada.

Esta clase enviará Eventos a otras clases. Este se ejecuta con un hilo.

 public class EventBus { // Non essential code here. ... // Thread code. private class MyThread implements Runnable { @Override public void run() { while(true) { synchronized(list) { for(Observer o : list) // Execution transfers to Activity here. o.handleEvent(event); } } } } } 

Dentro de una actividad.

 public class FirstActivity extends Activity implements Observer { public void handleEvent() { // Never gets here. } } 

Entonces, ¿cómo puedo resolver este problema? Mi aplicación completa tendrá muchas actividades y muchas clases regulares.

Para resolver mi problema

Necesito una manera de mantener vivo mi hilo y hacer llamadas a las actividades. Esto podría ser una mezcla de agregar algún código al hilo para que pueda enviar mis llamadas con éxito a las actividades.

Aunque no programa para Android, creo que no puede ser todo lo que es difícil hacer lo que quiere aquí. De la respuesta dada en su pregunta relacionada, la cuestión es que usted tendrá observadores que pueden o no ser una actividad. No puedes simplemente manejar el evento en la actividad debido a la naturaleza del modelo de Threading de actividad. Para las actividades es necesario que la acción se realice en el hilo de la interfaz de usuario. Esto suena bastante adelante. Uso de POJO He creado un SSCCE a continuación. La única parte que realmente sería de mucho interés es el casting que tiene lugar en el bucle del EventBus.

 public class Test { public static void main(String[] args) throws InterruptedException { //create the thread to demonstrate execution MyThread t = new MyThread(); //add a non activity observer t.addObserver(new NonActivityObserver()); //add an activity observer t.addObserver(new ActivityDecendent()); //fire off the thread new Thread(t).start(); //give us time to read the output Thread.sleep(Long.MAX_VALUE); } public static class MyThread implements Runnable { private ArrayList<Observer> list = new ArrayList<Observer>(); public void addObserver(Observer arg0) { synchronized (list) { list.add(arg0); } } @Override public void run() { //no loop just doing this once for example synchronized(list) { for(final Observer o : list) { //first try to cast to an Activity try { Activity act = (Activity)o; //if we get here, its an activity //so invoke on its UiThread act.runOnUiThread(new Runnable() { @Override public void run() { Event event = new Event("From the activity's runOnUiThread method"); o.handleEvent(event); } }); } catch (Exception e) { //if we got here, the class is not an activity //so it should be safe to just handle the event //on this thread Event event = new Event("From observers handle event method"); o.handleEvent(event); } } } } } //your observer interface public static interface Observer { public void handleEvent(Event e); } //Your Event class public static class Event { private String message; public Event(String message) { this.message = message; } public void talk() { System.out.println(message); } } //An observer which isnt an activity public static class NonActivityObserver implements Observer { @Override public void handleEvent(Event e) { e.talk(); } } //An activity which implements Observer public static class ActivityDecendent extends Activity implements Observer { @Override public void handleEvent(Event e) { e.talk(); } } //An Activity public static class Activity { //pretend this is the Android activity executing this runnable //on the UI thread public void runOnUiThread(Runnable r) { new Thread(r).start(); } } } 

Y la salida:

 From observers handle event method From the activity's runOnUiThread method 

Esta solución es sorta específica a su caso, que apesta … pero creo que esto debería funcionar.

  • Cómo utilizar Runnable.wait () en AsyncTask? ¿Por qué el AsyncTask NO espera ...?
  • cómo leer el flujo de entrada de socket en Android
  • ¿Se puede usar la fila de respaldo de archivo Square Tape en el hilo principal de android?
  • Android: "El cargador de clases puede fallar para los procesos que alojan múltiples aplicaciones"
  • ExecutorService parece estar ejecutando el hilo en la interfaz de usuario?
  • Cómo actualizar barra de progreso mediante el tema
  • Trabajos de fondo de Android para la sincronización con un servicio web
  • Android: Errores de archivo IO
  • Manejo de InterruptedException mientras espera una señal de salida (error en Android?)
  • Autenticador Okhttp multihilo
  • Especificaciones sobre el uso de Looper.prepare () en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.