2010-12-01 13 views
8

Estoy tratando de averiguar cuál es el mejor diseño general para las aplicaciones que acceden a varios servicios web y tienen múltiples actividades donde se muestra la información.Diseño de aplicaciones generales (IntentService/ContentProvider/AsyncTask)

La forma en que implementé mi última aplicación de Android es la siguiente. Tengo un IntentService que recibe solicitudes de actividades para obtener información de servicios web. Mi Service notifica las actividades a través de un ResultReceiver sobre el estado de la solicitud (iniciado/error/finalizado). Después de llamar al servicio web, obtener el resultado (xml/json) y analizarlo, puse esa información en un ContentProvider (respaldado por una base de datos sqlite) y uso un ContentResolver para notificar cualquier actividad sobre los cambios. Las actividades se notifican sobre los cambios (algunos usan ContentObserver y otros usan SimpleCursorAdapter sy se notifican automáticamente).

Ahora, los problemas con mi enfoque:

  • cada vez que entro en una actividad, que solicitan información del servicio web a través del método descrito anteriormente y que elimine todas las filas de esa tabla en particular, llenarlo con la nueva información y notificar a la actividad. Entonces, si el usuario presiona hacia atrás y luego vuelve a ingresar, vuelvo a bailar todo el baile. Creo que debería agregar algunos campos en la base de datos para cuándo fue la última actualización, etc. pero no sé exactamente cómo proceder con eso. Sugerencias? Creo que una alternativa sería usar alarmas y activar actualizaciones en intervalos específicos. Pero en mi caso, la especificación solicita verificar el servicio web cada vez que ingreso a la actividad.
  • Cuando llamo al servicio web, muestro una barra de progreso indeterminada en la actividad, sobre las otras vistas (que contienen la información recuperada previamente y que se encuentra en la base de datos hasta que finaliza la llamada al servicio web) pero el usuario puede comenzar a interactuar con las vistas y esto no es bueno (la información puede desaparecer de la base de datos). ¿Alguna forma de deshabilitar la interacción? Me viene a la mente un ProgressDialog.
  • si me muevo rápidamente por diferentes actividades, IntentService está bloqueado con llamadas anteriores al servicio web y me lleva más tiempo llegar a mi última llamada al servicio web. Podría crear múltiples IntentService para cada servicio web, pero no creo que este sea su objetivo.

Tengo la sensación de que el enfoque que he tomado no es realmente el mejor para esta aplicación en particular. Es parcialmente inspirado en la aplicación Google I/O (no pude entender todo, como los campos actualizados de sqlite, etc.). Una alternativa habría sido utilizar AsyncTasks en todas las actividades. Pero, ¿dónde puedo almacenar la información para acceder desde otras actividades? ¿En listas en Application? ¿Y qué tal la gestión de ids?

Estoy realmente interesado en sus opiniones/ideas/sugerencias y cómo puedo hacer que mis próximas aplicaciones funcionen mejor y más eficientemente.

Respuesta

2

¿Has consultado esta conversación? http://www.youtube.com/watch?v=xHXn3Kg2IQE

Me pareció una fuente de buena inspiración. Básicamente, sugieren construir un asistente de servicio (en su caso, un servicio auxiliar para su servicio de intención) como una clase singleton. Puede hacer un seguimiento de las solicitudes en curso

De esta manera puede realizar un seguimiento de cada tipo diferente de tareas en segundo plano en curso que esté realizando y bloquear cualquier otra solicitud del mismo tipo. Por ejemplo, si deja la actividad a e ingresa la actividad b, y solicitan la misma consulta del servicio web, puede verificar que todavía esté en progreso debido a la actividad a.

Según lo que vi en la aplicación iosched, sufre el problema de que si la actividad se cerró, el resultado de búsqueda se pierde.

Hay un registro claro que dice:

Log.w(TAG, "Dropping result on floor for code " + resultCode + ": " + resultData.toString());

No sugiero usando AsyncTask también, porque el resultado se perdería también.

Sin embargo, eche un vistazo a la charla y a las diapositivas.

+0

Bueno, he visto la presentación antes y me influenció al desarrollarla. Pero no fui hasta el final porque no me sentía lo suficientemente seguro. Ayudaría si pudiera ver más detalles de implementación con respecto al enfoque. ¿Puedes recomendar otras aplicaciones de código abierto de Android? Gracias. –

+0

Tuve que volver a implementarlo desde cero también, porque no pude encontrar ningún ejemplo de código abierto también. Es bastante malo que no brinden ejemplos de lo que hablan ... – fedepaol

Cuestiones relacionadas