Android SyncAdapter Rückruf

8

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.

    
JosephL 13.02.2012, 21:40
quelle

3 Antworten

1
Ich weiß, das ist eine alte Frage, aber ich habe das selbst gefragt. Was ich als eine gute Lösung herausgefunden habe, ist, dass ich die folgende Methode von ContentResolver verwende:

%Vor%

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.

    
Leandro 19.04.2014 14:13
quelle
1

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.

  1. Sie können den Status Ihres syncAdapters als Google I / O abhören App tut, suchen Sie in BaseActivity
  2. Ich habe mir die Standard-App für Android-E-Mails angesehen und sie verwenden Singleton mit CallBacks.
  3. Sie können BroadcastIntents verwenden oder einen eventBus (z. B. quadratisches Otto) verwenden, um Ihre Benutzeroberfläche über Verhalten zu informieren.

Ich mag das letzte besser, weil es Ihnen mehr Granularität bei den Ereignissen im syncAdapter gibt.

    
Sebastien 16.01.2015 11:41
quelle
-2

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.

    
Daily9Developer 21.05.2016 17:16
quelle