2009-07-22 13 views
6

Este es el trato: Tengo una aplicación de Android que necesita llamar a un servicio web cada X segundos (actualmente 60 segundos). Esta aplicación tiene múltiples pestañas y todas estas pestañas necesitan interactuar con los datos mismos. Uno es un MapView, uno es un ListView y luego el tercero es irrelevante, pero también tendrá que obtener algunos datos globales con el tiempo. El problema es que quiero que mi actividad principal tenga un hilo que se ejecute en segundo plano, obtenga los resultados y luego instruya a ambas actividades del niño en el TabHost para que se actualicen con los datos más recientes. Además, cuando el usuario hace clic en las pestañas y se activan las actividades onCreate/onResume, también me gustaría obligar a volver a dibujar obteniendo los datos más recientes de la actividad principal. Estoy realmente perdido aquí. He intentado esto con un servicio y algunos métodos ghetto estáticos para pasar una instancia de las Actividades al Servicio para llamar a funciones específicas para actualizar sus vistas cada vez que el temporizador disparaba, pero las ralentizaciones eran bastante malas y el código era feo feo feo . ¿Alguna sugerencia?La mejor manera de lograr la comunicación entre actividades en una aplicación Android TabHost

editar: Así que lo implementé como un hilo controlado por temporizador en la actividad tabhost y luego tengo hilos accionados por temporizador en cada actividad secundaria que luego toman los datos (de forma sincronizada) y actualizan su mapa/lista. Es mucho más rápido, pero todavía se siente un poco hack-ish, especialmente la parte en la que estoy llamando a una función personalizada en la actividad de los padres, así:

((MainActivity)getParent()).getNearbyMatches(); 

Esto añade un elemento de acoplamiento fuerte que no estoy totalmente encantada con, pero desde el punto de vista del rendimiento es mucho mejor de lo que era. Aprecio las respuestas que ya me han dado y haré un poco de investigación en el frente del proveedor de contenido, pero no estoy seguro de querer volver al modelo de servicio.

+0

¡Ojalá supiera cómo hacerlo también!+1 – cakeforcerberus

Respuesta

7

Así que he encontrado lo que creo que es la respuesta: The Application Class. Puede extender esta clase para realizar un seguimiento del estado global de la aplicación.

En el archivo AndroidManifest.xml puede hacer referencia a su clase personalizada totalmente calificada en el atributo android:name y se creará una instancia cuando se inicie la aplicación.

Cualquier actividad puede llamar al "getApplication()" y devolverá la instancia de su clase de aplicación personalizada, que luego puede adaptar a gusto.

+0

y ¿cómo puedo verificar dentro de una clase receptora si la actividad que debería iniciarse ya se está ejecutando? – bofredo

1

Puede implementar las actualizaciones de su GUI en Handler sy registrar las instancias Handler con su subproceso de descarga. El hilo de descarga luego envía mensajes a los controladores cuando llegan nuevos datos. Esencialmente este es el Observer Pattern. Puede encontrar un ejemplo de cómo usar Handler s here (expanda la sección 'Ejemplo de diálogo de progreso con un segundo subproceso').

5

¿Por qué está actualizando todas las actividades de los niños cada vez que hay nuevos datos disponibles? Eso me parece ineficiente. Actualice solo la actividad que está actualmente visible.

Una forma posible de hacerlo es a través de custom content provider. Deje que su servicio actualice la fuente de datos para sus actividades y obtenga la actividad visible actual para escuchar los cambios en este contenido. Así que, básicamente, se registra en el proveedor de contenido cuando se llama a OnResume y se anula el registro cuando se llama a OnPause.

Como regla general, ¡nunca almacene las referencias estáticas de una Actividad! Terminarás con fugas feas. Si es una necesidad para su aplicación, al menos use WeakReferences

Cuestiones relacionadas