SyncAdapter no se llama dependiendo del orden de las llamadas de configuración de cuenta
Me he encontrado con un comportamiento ligeramente extraño con mi SyncAdapter.
La primera vez que instalo mi aplicación (después de desinstalar con adb), se inicia y crea una cuenta. Dependiendo del orden de algunas declaraciones (vea más abajo), nunca se llamará mi onPerformSync () de SyncAdapter; Mi cuenta en "Cuentas y sincronización" muestra el icono de "sincronización en curso" girando indefinidamente. Si luego desmarco la casilla de verificación de sincronización junto a la cuenta de mi aplicación y la vuelvo a comprobar, mi onPerformSync () se llama inmediatamente.
- Cómo sincronizar datos entre diferentes dispositivos
- Android - Cómo descargar los datos en segundo plano en determinados momentos
- ¿Por qué Android activa una sincronización de cuenta de Google cada vez que agrego o elimino una cuenta de un tipo personalizado?
- Sincronización de archivos y bases de datos de Android con Dropbox
- Utilizando un local_manifest.xml con repo
Esto hace que mi SyncAdapter nunca se llame. "Sincronización en progreso" icono gira para siempre, a menos que desmarque, luego vuelva a comprobar 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 ordenamiento de las mismas afirmaciones, 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);
Mi conjetura es que estoy poniendo el SyncManager en un estado inconsistente debido a que disparar una solicitud de sincronización al instante en la creación de cuentas, y estoy cambiando su configuración bajo sus pies. Pero la documentación (apenas coherente) no menciona ningún problema con llamar a estas funciones cuando quieras.
Como un aparte para otros que luchan con SyncAdapters, encontré que contentResolver.requestSync()
nunca disparará su SyncAdapter.onPerformSync()
menos que usted llame a ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
.
¿Podría alguien explicar este comportamiento? La documentación que rodea a las cuentas y la sincronización es algo poco clara por decir lo menos.
Estoy recibiendo este comportamiento en el emulador 2.1, compilar contra el SDK 2.1.
- ¿Cómo saber cuándo se termina la sincronización?
- Cómo mostrar el mensaje de error de sincronización
- API de copia de seguridad de Android
- Sincronizar datos SQLite desde el teléfono Android a la base de datos MySQL de MySQL de Windows
- ¿Cómo funciona la sincronización de datos y cómo la uso en aplicaciones cliente-servidor?
- Adaptador de sincronización sin cuenta
- ¿Cómo implementar la sincronización de datos entre dispositivos en línea y sin conexión con el motor de aplicaciones de Google?
- Android sync strings.xml
He encontrado que contentResolver.requestSync()
nunca disparará su SyncAdapter.onPerformSync () a menos que llame a ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
.
Para una cuenta detallada de la solución que fui con SyncAdapter, vea mi respuesta aquí:
Acabo de golpear mi cabeza contra una pared durante horas tratando de averiguar por qué la sincronización periódica no estaba funcionando. Resulta que la frecuencia de la encuesta debe ser en segundos (literal) no milisegundos, y no segundos en milisegundos. Por ejemplo, si desea sincronizar cada minuto y medio, deberá llamar a:
ContentResolver.addPeriodicSync( account, authority, Bundle.EMPTY, 90 );
Además, el paquete pasado en no puede ser nulo como está en la documentación, se lanzará una excepción NullPointerException.
- LocationManager's getBestProvider devolver null
- Android Google SignIn no funciona en modo de depuración: GoogleSignInResult es falso