syncadapter - sync adapter android ejemplo
No se llama a SyncAdapter según el orden de las llamadas de configuración de la cuenta (2)
Descubrí que contentResolver.requestSync()
nunca activará su SyncAdapter.onPerformSync () a menos que llame a ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
.
Para obtener una descripción detallada de la solución con la que utilicé SyncAdapter, vea mi respuesta aquí:
https://stackoverflow.com/a/12015967/988870
Me he encontrado con un comportamiento ligeramente extraño con mi SyncAdapter.
La primera vez que instalo mi aplicación (después de desinstalarla con adb), se inicia y crea una cuenta. Según el orden de algunas declaraciones (ver a continuación), nunca se llamará a mi SyncAdapter''s onPerformSync (); Mi cuenta en "Cuentas y sincronización" muestra el ícono de "sincronización en curso" girando indefinidamente. Si luego desactivo la casilla de verificación de sincronización junto a la cuenta de mi aplicación y luego la vuelvo a marcar, se llama a mi onPerformSync () inmediatamente.
Esto hace que nunca se llame a mi SyncAdapter. El ícono de "sincronización en progreso" gira para siempre, a menos que lo desmarque y luego vuelva a marcar la casilla de verificación de sincronización:
final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
mAccountManager.addAccountExplicitly(account, mPassword, null);
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
Con este orden de las mismas declaraciones, todo funciona perfectamente:
final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
mAccountManager.addAccountExplicitly(account, mPassword, null);
Supongo que estoy poniendo el SyncManager en un estado incoherente debido a que desencadenó una solicitud de sincronización instantáneamente en la creación de la cuenta, y estoy cambiando la configuración a sus pies. Pero la documentación (apenas coherente) no menciona ningún problema al llamar a estas funciones cuando lo desee.
Como parte de otros que luchan con SyncAdapters, encontré que contentResolver.requestSync()
nunca activará su SyncAdapter.onPerformSync()
menos que llame a ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
.
¿Podría alguien explicar este comportamiento? La documentación que rodea las Cuentas y la Sincronización es algo poco clara por decir lo menos.
Estoy obteniendo este comportamiento en el 2.1 Emulator, compilando contra el 2.1 SDK.
Me golpeé la cabeza contra la pared durante horas tratando de averiguar por qué la sincronización periódica no funcionaba. Resulta que la frecuencia de sondeo debe ser en segundos (literal), no en milisegundos, y no en segundos en milisegundos. Entonces, por ejemplo, si desea que se sincronice cada minuto y medio, deberá llamar:
ContentResolver.addPeriodicSync(
account,
authority,
Bundle.EMPTY,
90
);
Además, el paquete pasado no puede ser nulo como está en la documentación, lanzará una NullPointerException.