2012-07-06 12 views
7

Chcę wiedzieć, co jest domyślne zachowanie SyncManager gdy używamy obiektu SyncResult podczas operacji onPerformSync()SyncAdapter & SyncResult

Na przykład, gdy synchronizacja jest błędna z powodu IOException ustawiamy

syncResult.stats.numIoExceptions++ 

Następnie SyncManager musi zarządzać ponownym wysyłaniem synchronizacji do czasu określonego przez system.

Ale ile razy synchronizacja jest ponownie wywoływana, jeśli przy każdej synchronizacji pojawi się IOException? Jaki jest domyślny zestaw opóźnień między każdą synchronizacją? Czy można zdefiniować własne zachowania? Gdzie mogę znaleźć dokumentację na ten temat?

Odpowiedz

6

Obiekt SyncResult ma pole delayUntil, które można ustawić z adaptera synchronizacji, co opóźni każdą następną synchronizację o określoną liczbę sekund. Może to pole, którego szukasz.

przeciwnym razie synchronizacja zostanie przełożone jeśli

SyncResult.madeSomeProgress() zwraca true - czyli trochę pracy zostało pomyślnie przeprowadzić synchronizacji (odpowiadającej stats.numDeletes, stats.numInserts > 0, stats.numUpdates > 0)

SyncResult.hasSoftError() powraca prawda - to znaczy nie ze względu do IOException lub ponieważ SyncResult.syncAlreadyInProgress było prawdziwe.

Aby odpowiedzieć na Twoje pytanie, jeśli wystąpi IOException s przy KAŻDEJ synchronizacji, SyncManager ponowi próbę reklamy w nieskończoność - z wykładniczym wycofaniem.

Ograniczeniem jest to, że adapter synchronizacji może ustawić SyncResult.tooManyRetries = true, co oznacza SyncManager, że synchronizacja nie ma zostać zmieniona.

1

Początkowy czas ponawiania:

/** 
* When retrying a sync for the first time use this delay. After that 
* the retry time will double until it reached MAX_SYNC_RETRY_TIME. 
* In milliseconds. 
*/ 
private static final long INITIAL_SYNC_RETRY_TIME_IN_MS = 30 * 1000; // 30 seconds 

Można powiedzieć ram do zatrzymania Ponowna próba synchronizacji poprzez ustawienie SyncResult#tooManyRetries do true.

Źródło: SyncManager.java

Powiązane problemy