Ich habe einen SyncAdapter, einen AccountManager und einen privaten ContentProvider entlang des SimpleSyncAdapter-Beispielprojekts im SDK implementiert. Es funktioniert alles gut.
Nun möchte ich dem Benutzer eine Nachricht anzeigen, wenn neue Zeilen vom Remote-Server heruntergeladen wurden, für die ein bestimmtes Flag gesetzt ist. Ich brauche einen Rückruf vom SyncAdapter, wenn eine Synchronisierung beendet ist, damit ich die Abfrage durchführen und die Nachricht von einer Aktivität anzeigen kann. Ich habe ein paar Fragen zu StackOverflow gesehen, die das diskutieren, aber keine mit einer guten Antwort.
Wie hört man den Fortschritt von Android SyncAdapter? sagt, dass der SyncStatusObserver nutzlos ist. Benutzer mobibob schlägt vor, einen ResultReceiver zu verwenden, um vom Sync-Thread auf die Benutzeroberfläche zu antworten.
Wie kann ich wissen, wann die Synchronisierung abgeschlossen ist? schlägt vor, ein Absicht in Ihrem SyncService.
Wie wird Sync-Complete an den Android SyncManager gesendet? schlägt vor, das SyncResult zu verwenden. Der Beispielcode, auf den maxpower47 verweist, verwendet die SyncResult-Klasse, um Ausnahmen zu melden, aber nicht, wenn eine Synchronisierung erfolgreich abgeschlossen wurde.
Ich weiß nur nicht, welche die beste Option ist und ich habe keine Beispielprojekte gesehen, in denen eine dieser Lösungen verwendet wird.
Damit wird eine Observer-Klasse registriert, die einen Rückruf erhält, wenn sich die durch einen bestimmten Inhalts-URI identifizierten Daten ändern. Dies kann jedoch nur passieren, wenn der ContentProvider die Benachrichtigung sendet. Wenn Sie zum Beispiel oben auf dem ContentObserver für alle Aktualisierungen benachrichtigt werden möchten, die in Ihrer Datenbank über einen ContentProvider durchgeführt werden, sollte Ihr ContentProvider ein ähnliches Update wie folgt implementieren:
%Vor%Die Verwendung von notifyForDescendents bei einem registerContentObserver kann sehr nützlich sein.
Das ist eine alte Frage, aber ich habe in den letzten Tagen etwas recherchiert und es gibt nicht viele Beispiele dafür, wie SyncAdapter Netzwerkanforderungen bearbeitet und die Benutzeroberfläche benachrichtigt.
Zuerst sollten Sie Loader mit contentProvider verwenden, um Ihnen das Leben zu erleichtern. Sie müssen sich nicht mehr für den Content Resolver registrieren, der Loader erledigt dies für Sie. Es bedeutet also, dass Ihre Benutzeroberfläche für alles benachrichtigt wird, was in Ihren Inhaltsanbieter eintritt.
Was ist, wenn sich nichts geändert hat? Alles war auf dem neuesten Stand oder Sie hatten einen Netzwerkfehler.
Ich mag das letzte besser, weil es Ihnen mehr Granularität bei den Ereignissen im syncAdapter gibt.
Wir sind in eine ähnliche Situation geraten und haben eine statische Listener-Schnittstelle zum SyncAdapter geschrieben. Der Listener ist die Aktivität und führt die erforderlichen Aktionen aus, wenn die Daten verfügbar sind (UI aktualisieren). Dies funktioniert auch, wenn der Synchronisationsadapter während der automatischen Synchronisierung vom System aufgerufen wird und dieser Listener null ist und der Synchronisierungsprozess sich um sein eigenes Geschäft kümmert.
%Vor% Implementieren Sie dann in der Aktivität SyncAdapter.Listener
interface.
Tags und Links android synchronization android-syncadapter callback