2012-03-09 12 views
5

Una aplicación puede tener partes que se ejecutan en subprocesos separados y devolver la llamada a algún objeto cuando termina. Un patrón típico puede verse así:¿Cuáles son las buenas estrategias para manejar devoluciones de llamada asincrónicas en Android?

1) una Vista o Fragmento realiza una llamada a algún modelo. La llamada se origina desde algún punto de vista o fragmento

model.doSomething(context, new Runnable() { 
    public void run() { /* run on the main thread when model finishes */ } 
}); 

2) un modelo utiliza un hilo o AsyncTask que hace algo y luego llama a la devolución de llamada en el subproceso de llamada - el uso de un manejador de

void doSomething(Context context, Runnable callback) { 
    Handler handler = new Handler(); 
    // ... 
    // When finished (this is really done on some separate thread), 
    handler.post(callback); 
} 

3) la la devolución de llamada interactúa con la vista de llamada o el Fragmento para avanzar a través de alguna lógica de control

La devolución de llamada puede estar tocando el estado de una Vista que no está conectada a una ventana, lo que puede provocar inestabilidad en la aplicación.

¿Cuáles son algunas buenas estrategias para manejar esta situación?

Respuesta

1

Parece que desea manejar la comunicación entre su modelo y su vista de una manera más uniforme. Una buena manera de separarlos es utilizar un servicio:

http://developer.android.com/reference/android/app/Service.html

Si estás aplicación sólo se ejecuta en un solo proceso, sugeriría mirar en el IntentService desde su mucho más fácil de usar.

Un gran ejemplo de esto es el Google IO 2011 IOSched aplicación:

http://code.google.com/p/iosched/

parece bastante grande, pero la arquitectura es bien pensado en lo que respecta a la separación de las preocupaciones de datos (ya sea a partir de recursos locales o remotos) El segundo beneficio de ejecutarlo en su propio servicio en lugar de vincular una devolución de llamada en su vista es que el servicio se encuentra fuera del ciclo de vida de la actividad, por lo que no debe preocuparse por lo que ocurre cuando se activa su actividad. destruido/en pausa Muchas veces, al utilizar devoluciones de llamada como estas, se llamará a la devolución de llamada y es posible que la actividad aún no esté activa.

+0

Gracias Stephan, echaré un vistazo a la aplicación 2011 IOSched. Un servicio parece excesivo porque parece que debería haber una forma de publicar mensajes de manera segura en una vista o un fragmento. He estado experimentando con el uso de la publicación (...), pero todavía tengo una idea de cómo funciona en el caso de cuando la ventana no es visible, y los patrones de Android en general. –

+0

Parece exagerado, pero cada vez que usa un patrón de devolución de llamada como este, generalmente realiza algún tipo de tarea asincrónica de larga ejecución. Como puede haber un gran diferencial de tiempo entre la invocación y la finalización, debe comenzar a preocuparse por cómo el tiempo afectará su estado. Esto se vuelve más problemático cuando se trabaja dentro del ciclo de vida de la actividad, ya que no hay garantías sobre el estado actual de su actividad. –

Cuestiones relacionadas