2012-07-06 12 views
7

voglio sapere che cosa è il comportamento predefinito di SyncManager quando usiamo l'oggetto SyncResult durante l'operazione onPerformSync()SyncAdapter & SyncResult

Per esempio, quando la sincronizzazione è in errore a causa di IOException, abbiamo impostato

syncResult.stats.numIoExceptions++ 

Quindi SyncManager deve gestire la sincronizzazione di ritrasmissione finché un ritardo non viene specificato dal sistema.

Ma quante volte la sincronizzazione viene richiamata se IOException si verifica ad ogni sincronizzazione? Qual è il ritardo predefinito impostato tra ciascuna sincronizzazione? È possibile definire i propri comportamenti? Dove posso trovare la documentazione al riguardo?

risposta

6

L'oggetto SyncResult ha un campo delayUntil che è possibile impostare dall'adattatore di sincronizzazione che ritarderà ogni sincronizzazione successiva per il numero di secondi specificato. Forse questo è il campo che stai cercando.

In caso contrario, la sincronizzazione sarà riprogrammato se

SyncResult.madeSomeProgress() restituisce true - vale a dire un po 'di lavoro è stato compiuto con successo dalla sincronizzazione (corrispondente al stats.numDeletes, stats.numInserts > 0, stats.numUpdates > 0)

SyncResult.hasSoftError() restituisce true - vale a dire che non è riuscita a causa a IOException o perché SyncResult.syncAlreadyInProgress era vero.

Quindi, per rispondere alla tua domanda, se IOException si verificano in OGNI sincronizzazione, lo SyncManager riproverà all'infinito - con il backoff esponenziale.

L'avvertimento è che l'adattatore di sincronizzazione può impostare SyncResult.tooManyRetries = true che indicherà allo SyncManager che la sincronizzazione non deve essere riprogrammata.

1

Il numero di tentativi iniziali:

/** 
* 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 

Si può dire il quadro di smettere di ritentare la sincronizzazione impostando SyncResult#tooManyRetries a true.

Fonte: SyncManager.java

Problemi correlati