Android SyncAdapter atascado en un bucle de sincronización infinito
Estoy escribiendo un adaptador de sincronización de Android y, básicamente, tener un problema con la sincronización en un bucle infinito. Tan pronto como la sincronización se completa, comienza de nuevo.
Gracias,
- Android: Cómo escuchar cambios de contacto como WhatsApp
- Coloque varios parámetros en ContentResolver.requestSync
- Sincronización personalizada que no funciona con la cuenta de Google (com.google) en algunos dispositivos Samsung
- Sincronizar cliente Android y servidor REST
- ¿Cuánto tiempo persisten los paquetes de SyncManager?
Saludos,
Akshay
@Override public void onPerformSync(final Account account, final Bundle extras, final String authority, final ContentProviderClient provider, final SyncResult syncResult) { Log.i("Sync result full sync = " + syncResult.fullSyncRequested); Log.i("Sync result " + syncResult.toDebugString()); Log.i("Bundle " + extras.toString()); final CountDownLatch latch = new CountDownLatch(3); final CachedDataReceiver globalStreamRefreshReciever = new CachedDataReceiver(null) { @Override protected void onComplete(int resultCode) {latch.countDown();} @Override protected void onError() {latch.countDown();} }; final CachedDataReceiver newMessagesReciever = new CachedDataReceiver(null) { @Override protected void onComplete(int resultCode) {latch.countDown();} @Override protected void onError() {latch.countDown();} }; final CachedDataReceiver getViewedMessagesReciever = new CachedDataReceiver(null) { @Override protected void onComplete(int resultCode) {latch.countDown();showAnyNewInboxItemAlerts(getApplicationContext());} @Override protected void onError() {latch.countDown();} }; /*long currentTime = System.currentTimeMillis(); long netTime = currentTime-getLastSyncTimeStamp(); boolean shouldSync = (netTime - getSyncInterval()) >=0; if (!shouldSync && getSyncInterval()!=Constants.INVALID_ITEM){ Log.i("Current time = " + currentTime + " last sync = " + getLastSyncTimeStamp() + " sync interval = " + getSyncInterval()); Log.i("Difference = " + (netTime - getSyncInterval())); return; }*/ if (user.isUserLoggedIn() && (!TextUtils.isEmpty(user.peekLoggedInUserAccountToken(null)))){ startService(api.getGlobalStream(0,10,globalStreamRefreshReciever)); startService(api.getNewMessagesInbox(newMessagesReciever)); startService(api.getViewedMessagesInbox(false, getViewedMessagesReciever)); addTimeStamp(); Log.i("in sync"); try { latch.await(1, TimeUnit.MINUTES); } catch (InterruptedException interruptedException) { interruptedException.printStackTrace(); Log.e("Error in latch while sync "); } } }
- Autenticador Android inicia la pantalla de inicio de sesión cuando no hay cuenta presente
- ¿Cómo sincronizar los datos del servidor en la aplicación android?
- Eliminar la base de datos cuando se quita una cuenta
- Cómo definir la frecuencia de las actualizaciones de SyncAdapter en android?
- Los puntos de interrupción de SampleSyncAdapter no funcionan
- En Android, ¿debe ejecutarse un adaptador de sincronización de contactos en un proceso independiente?
- GcmTaskService vs SyncAdapter
- SyncAdapter no se sincroniza automáticamente
Te estás perdiendo mucho código allí, difícil de encontrar tu problema cuando no nos dicen lo que estás haciendo.
Salir en una extremidad con una conjetura a sus problemas …
¿O addTimeStamp()
o los diversos servicios que crea modifican los datos almacenados en su ContentProvider?
Si es así, ¿su ContentProvider llama a ContentResolver.notifyChange(uri, null)
?
Si es así, su ContentProvider notifica a Android que ha cambiado y necesita una sincronización, conduciendo así un bucle.
El API es notifyChange (Uri uri, ContentObserver observer, boolean syncToNetwork)
. Necesita llamar con notifyChange(uri, null, false);
– Esto indica que usted ha sacado un cambio de la red y que no debe ser empujado de nuevo a la red, rompiendo así el bucle.
Cuando tenemos ContentObserver registrado, el adaptador de sincronización entrará en bucle incluso después de establecer la sincronización como falsa.
notifyChange(uri, null, false);
- ¿Cómo comprobar el reino para la existencia de los datos del androide?
- ¿Hacer que mi aplicación se inicie cuando se ingrese código secreto?