2009-07-22 7 views
6

Hier ist der Deal: Ich habe eine Android-Anwendung, die einen Web-Service alle X Sekunden (derzeit 60 Sekunden) aufrufen muss. Diese Anwendung hat mehrere Registerkarten und diese Registerkarten müssen alle mit den Daten selbst interagieren. Einer ist ein MapView, einer ist ein ListView und dann ist der dritte irrelevant, muss aber auch einige globale Daten erhalten. Das Problem ist, dass ich möchte, dass meine Hauptaktivität einen Thread hat, der im Hintergrund ausgeführt wird, die Ergebnisse abruft und dann beide untergeordneten Aktivitäten im TabHost anweist, sich selbst mit den neuesten Daten zu aktualisieren. Wenn der Benutzer auf die Registerkarten klickt und die onCreate/onResume-Aktivitäten ausgelöst werden, möchte ich außerdem ein Neuzeichnen erzwingen, indem die neuesten Daten aus der Hauptaktivität abgerufen werden. Ich bin hier wirklich ratlos. Ich habe dies mit einem Dienst und einigen Ghetto-statischen Methoden versucht, um eine Instanz der Aktivitäten an den Dienst zu übergeben, um bestimmte Funktionen aufzurufen, um ihre Ansichten zu aktualisieren, wann immer der Timer ausgelöst wurde, aber die Verlangsamungen waren ziemlich schlecht und der Code war nur hässlich hässlich . Irgendwelche Vorschläge?Der beste Weg, Interaktivität in einer Android TabHost-Anwendung zu erreichen

edit: Also habe ich es als Timer-gesteuerten Thread in der Tabhost-Aktivität implementiert und dann habe ich Timer-gesteuerte Threads in jeder untergeordneten Aktivität, die dann die Daten (in einer synchronisierten Weise) greifen und ihre Karte/Liste aktualisieren. Es ist viel schneller, aber immer noch fühlt sich leicht hack-ish, vor allem den Teil, wo ich wie so eine benutzerdefinierte Funktion in der übergeordneten Aktivität bin Aufruf:

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

Dies ein Element der starken Kopplung fügt hinzu, dass ich nicht ganz begeistert bin mit, aber vom Standpunkt der Leistung ist es viel besser als es war. Ich schätze die Antworten, die bereits gegeben wurden, und werde etwas über die Front des Inhaltsanbieters recherchieren, aber ich bin mir nicht sicher, ob ich zum Servicemodell zurückkehren möchte.

+0

Ich wünschte, ich könnte das auch!+1 – cakeforcerberus

Antwort

7

Also ich habe gefunden, was ich glaube, ist die Antwort: The Application Class. Sie können diese Klasse erweitern, um den globalen Anwendungsstatus zu verfolgen.

In der Datei AndroidManifest.xml können Sie Ihre voll qualifizierte benutzerdefinierte Klasse im Attribut android:name referenzieren, und sie wird beim Starten der App instanziiert.

Jede Aktivität kann dann "getApplication()" aufrufen und es wird die Instanz Ihrer benutzerdefinierten Anwendungsklasse zurückgegeben, die Sie dann nach Belieben anpassen können.

+0

und wie kann ich innerhalb einer Empfänger-Klasse überprüfen, ob die Aktivität, die es starten sollte, bereits ausgeführt wird? – bofredo

1

Sie können Ihre GUI-Updates in Handler s implementieren und die Handler Instanzen mit Ihrem Download-Thread registrieren. Der Download-Thread sendet dann Nachrichten an die Handler, wenn neue Daten eintreffen. Im Wesentlichen ist dies die Observer Pattern. Sie finden ein Beispiel für die Verwendung von Handler s here (erweitern Sie den Abschnitt "Beispiel ProgressDialog mit einem zweiten Thread").

5

Warum aktualisieren Sie alle untergeordneten Aktivitäten jedes Mal, wenn neue Daten verfügbar sind? Das klingt für mich ineffizient. Aktualisieren Sie nur die Aktivität, die derzeit sichtbar ist.

Eine Möglichkeit, dies zu tun, ist durch eine custom content provider. Lassen Sie Ihren Service die Datenquelle auf Ihre Aktivitäten aktualisieren und holen Sie sich die aktuelle sichtbare Aktivität, um Änderungen an diesem Inhalt zu hören. Wenn Sie OnPasure aufrufen, werden Sie beim OnResume registriert und die Registrierung aufgehoben.

Als Faustregel sollten niemals statische Referenzen einer Aktivität gespeichert werden !! Sie werden mit hässlichen Lecks enden. Wenn es ein Muss für Ihre Anwendung ist, dann verwenden Sie mindestens WeakReferences