Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Diseño general de la aplicación (IntentService / ContentProvider / AsyncTask)

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.

La forma en que implementé mi última aplicación de Android es la siguiente. Tengo un IntentService que recibe peticiones 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 / terminado). Después de llamar al servicio web, obtener el resultado (xml / json) y analizarlo, pongo 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 utilizan ContentObserver y otros utilizan SimpleCursorAdapter s y se notifican automáticamente).

Ahora, los problemas con mi enfoque:

  • Cada vez que entro en una actividad, solicito información del servicio web a través del método descrito anteriormente y elimino todas las filas de esa tabla en particular, la relleno con la nueva información y notifico la actividad. Por lo tanto, si el usuario presiona hacia atrás y luego entra de nuevo, hago todo el baile de nuevo. Creo que debo añadir algunos campos en la base de datos para cuando fue la última actualización, etc, pero no sé cómo exactamente proceder con eso. Sugerencias? Creo que una alternativa sería utilizar alarmas y activar actualizaciones a intervalos específicos. Pero en mi caso, la especificación solicita verificar el servicio web cada vez que entro en 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 obtenida anteriormente y que se encuentra en la base de datos hasta que termina 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). Cualquier forma de desactivar la interacción? Un ProgressDialog viene a la mente.
  • Si me muevo rápidamente a través de diferentes actividades, el IntentService se bloquea con llamadas de servicio web anteriores y se tarda más en llegar a mi última llamada de servicio web. Podría crear múltiples IntentService para cada servicio web, pero no creo que este es su propósito.

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

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

  • Tipos de datos utilizados en SQLite
  • Cómo implementar Exportar sqlite Para sobresalir / archivo csv en android?
  • Enfoque para rellenar la vista de lista expandible con la base de datos SQlite local
  • Obteniendo la fecha de la base de datos de Sqlite en android
  • Exportación de una base de datos SQLite a un archivo XML en Android
  • Cómo solucionar el error "HeapWorker is wedged" en Android?
  • Obtención del siguiente valor AUTO_INCREMENT de una base de datos SQLite
  • ¿Cómo implementar una base de datos SQLite en Phonegap?
  • One Solution collect form web for “Diseño general de la aplicación (IntentService / ContentProvider / AsyncTask)”

    ¿Revisaste esta charla? http://www.youtube.com/watch?v=xHXn3Kg2IQE

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

    De esta manera puede realizar un seguimiento de cada tipo de tareas de fondo en curso que está realizando y bloquear cualquier otra solicitud del mismo tipo. Por ejemplo, si deja la actividad a e introduce la actividad b, y solicita la misma consulta de servicio web, puede comprobar que todavía está en curso debido a la actividad a.

    Por lo que vi en la aplicación iosched, sufre el problema de que si la actividad se cerró, el resultado de extracción se pierde.

    Hay un registro claro que dice:

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

    No sugiero usar asynctask demasiado, porque el resultado se perdería también.

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

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.