2009-07-22 9 views
6

Ecco l'affare: ho un'applicazione Android che deve chiamare un servizio Web ogni X secondi (attualmente 60 secondi). Questa applicazione ha più schede e queste schede devono interagire con i dati stessi. Uno è un MapView, uno è un ListView e quindi il terzo è irrilevante, ma alla fine sarà necessario anche ottenere alcuni dati globali. Il problema è che voglio che la mia attività principale abbia un thread che viene eseguito in background, ottiene i risultati e poi istruisce entrambe le attività child nel TabHost per aggiornarsi con i dati più recenti. Inoltre, quando l'utente fa clic sulle schede e le attività onCreate/onResume si attivano, vorrei anche forzare un nuovo aggiornamento ottenendo i dati più recenti dall'attività principale. Sono davvero in perdita qui. Ho provato questo con un servizio e alcuni metodi statici ghetto per passare un'istanza delle Attività al Servizio per chiamare funzioni specifiche per aggiornare le loro visualizzazioni ogni volta che il timer ha sparato, ma i rallentamenti erano piuttosto brutti e il codice era solo brutto brutto brutto . Eventuali suggerimenti?Il modo migliore per realizzare la comunicazione tra le attività in un'applicazione TabHost Android

modifica: Quindi l'ho implementato come thread guidato dal timer nell'attività tabhost e quindi ho thread comandati dal timer in ogni attività figlio che quindi acquisiscono i dati (in modo sincronizzato) e aggiornano la loro mappa/elenco. E 'molto più veloce, ma ancora si sente un po' hack-ish, in particolare la parte in cui sto chiamando una funzione personalizzata nell'attività genitore in questo modo:

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

Questo aggiunge un elemento di forte accoppiamento che non sono del tutto entusiasti con, ma dal punto di vista delle prestazioni è molto meglio di quello che era. Apprezzo le risposte che sono già state fornite e farò un po 'di ricerche sul front-end dei content provider, ma non sono sicuro di voler tornare al modello di servizio.

+0

Vorrei sapere come fare anche questo!+1 – cakeforcerberus

risposta

7

Quindi ho trovato quello che credo sia la risposta: The Application Class. È possibile estendere questa classe per tenere traccia dello stato dell'applicazione globale.

Nel file AndroidManifest.xml è possibile fare riferimento alla classe personalizzata completamente qualificata nell'attributo android:name e verrà creata un'istanza al momento dell'accensione dell'applicazione.

Qualsiasi attività può quindi chiamare "getApplication()" e restituirà l'istanza della classe di applicazione personalizzata, che è quindi possibile personalizzare.

+0

e come posso verificare all'interno di una classe ricevente se l'attività che dovrebbe avviare, è già in esecuzione? – bofredo

1

È possibile implementare gli aggiornamenti della GUI in Handler se registrare le istanze Handler con il thread di download. Il thread di download invia quindi messaggi ai gestori quando arrivano nuovi dati. Essenzialmente questo è il Observer Pattern. È possibile trovare un esempio di come utilizzare Handler s here (espandere la sezione "Esempio ProgressDialog con un secondo thread").

5

Perché si aggiornano tutte le attività dei bambini ogni volta che sono disponibili nuovi dati? Mi sembra inefficiente. Aggiorna solo l'attività attualmente visibile.

Un modo possibile per farlo è tramite un custom content provider. Consenti al tuo servizio di aggiornare l'origine dati alle tue attività e ottenere l'attività visibile corrente per ascoltare le modifiche su questo contenuto. Quindi, in sostanza, il registro viene registrato al provider di contenuti quando viene chiamato OnResume e si annulla la registrazione quando viene chiamato OnPause.

Come regola empirica non memorizzare mai riferimenti statici di un'attività !! Finirai con brutte notizie. Se è necessario per la tua applicazione, allora almeno utilizza WeakReferences

Problemi correlati