Allgemeiner Anwendungsentwurf (IntentService / ContentProvider / AsyncTask)

8

Ich versuche herauszufinden, welches das beste allgemeine Design für Anwendungen ist, die auf mehrere Webdienste zugreifen und mehrere Aktivitäten haben, bei denen Informationen angezeigt werden.

Die Art und Weise, wie ich meine neueste Android-Anwendung implementiert habe, ist folgende. Ich habe eine IntentService , die Anfragen von Aktivitäten erhält, um Informationen von Webdiensten zu erhalten. Mein Service benachrichtigt die Aktivitäten über einen ResultReceiver über den Status der Anfrage (gestartet / error / finished). Nachdem ich den Webservice aufgerufen, das Ergebnis (xml / json) abgerufen und analysiert habe, stelle ich diese Informationen in ein ContentProvider (gesichert durch eine SQLite-Datenbank) und benutze ContentResolver , um alle Aktivitäten über die Änderungen zu melden. Die Aktivitäten werden über die Änderungen benachrichtigt (einige verwenden ContentObserver und andere verwenden SimpleCursorAdapter s und werden automatisch benachrichtigt).

Nun, die Probleme mit meinem Ansatz:

  • jedes Mal, wenn ich eine Aktivität eintrage, fordere ich Informationen vom Webservice über die oben beschriebene Methode an und lösche alle Zeilen in dieser bestimmten Tabelle, fülle sie mit den neuen Informationen und benachrichtige die Aktivität. Also, wenn der Benutzer zurückdrückt und dann wieder eintritt, mache ich den ganzen Tanz wieder. Ich denke, ich sollte einige Felder in der Datenbank hinzufügen, wann die letzte Aktualisierung usw. war, aber ich weiß nicht, wie genau ich damit verfahren soll. Vorschläge? Ich denke, eine Alternative wäre die Verwendung von Alarmen und das Auslösen von Updates in bestimmten Intervallen. Aber in meinem Fall verlangt die Spezifikation, den Web-Service jedes Mal zu überprüfen, wenn ich die Aktivität betrete.
  • Wenn ich den Web-Service anrufe, zeige ich in der Aktivität einen unbestimmten Fortschrittsbalken über die anderen Ansichten (die die zuvor abgerufenen Informationen enthalten und bis zum Ende des Web-Service-Aufrufs in der Datenbank gespeichert sind), aber der Benutzer kann mit der Interaktion beginnen mit den Ansichten und das ist nicht gut (die Informationen können aus der Datenbank verschwinden). Irgendeine Möglichkeit, die Interaktion zu deaktivieren? Ein ProgressDialog kommt mir in den Sinn.
  • Wenn ich schnell verschiedene Aktivitäten durchführe, wird der IntentService bei früheren Web-Service-Anrufen blockiert und es dauert länger, bis ich zu meinem letzten Web-Service-Anruf komme. Ich könnte mehrere IntentService für jeden Webservice erstellen, aber ich denke nicht, dass dies der Zweck ist.

Ich habe das Gefühl, dass der Ansatz, den ich gewählt habe, nicht wirklich der beste für diese spezielle Anwendung ist. Es ist teilweise von der Google I / O-Anwendung inspiriert (ich konnte nicht alles verstehen, wie die aktualisierten SQLite-Felder usw.). Eine Alternative wäre die Verwendung von AsyncTasks in allen Aktivitäten. Aber wo kann ich die Informationen speichern, um von anderen Aktivitäten aus erreichbar zu sein? In Listen in Application ? Und wie wäre es mit ID-Management?

Ich bin wirklich an Ihren Meinungen / Ideen / Vorschlägen interessiert und wie kann ich meine nächsten Anwendungen besser und effizienter machen.

    
Catalin Morosan 01.12.2010, 09:21
quelle

1 Antwort

2

Hast du dieses Gespräch überprüft? Ссылка

Ich fand es eine Quelle guter Inspiration. Im Grunde schlagen sie vor, einen Service-Helfer (in Ihrem Fall ein Service-Helfer für Ihren Intent-Service) als Singleton-Klasse aufzubauen. Sie können die laufenden Anfragen verfolgen

Auf diese Weise können Sie jede andere Art von laufenden Hintergrundaufgaben, die Sie ausführen, verfolgen und jede andere Anfrage der gleichen Art blockieren. Wenn Sie z. B. die Aktivität a verlassen und die Aktivität b eingeben, und sie nach derselben Web-Service-Abfrage fragen, können Sie überprüfen, ob sie aufgrund der Aktivität a noch aktiv ist.

Nach dem, was ich in der iosched-App gesehen habe, leidet es unter dem Problem, dass das Abrufergebnis verloren geht, wenn die Aktivität geschlossen wurde.

Es gibt ein klares Protokoll, das besagt:

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

Ich schlage auch nicht vor, asynctask zu verwenden, weil das Ergebnis auch verloren gehen würde.

Sehen Sie sich jedoch das Gespräch und die Folien an.

    
fedepaol 01.12.2010, 11:58
quelle

Tags und Links