2011-08-16 8 views
5

Estoy escribiendo un adaptador de sincronización de Android y básicamente tengo un problema con la sincronización en un bucle infinito. Tan pronto como se completa la sincronización, comienza todo de nuevo.Android SyncAdapter atascado en el bucle de sincronización infinito

Gracias,

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 "); 
      } 

     } 
    } 
+0

posible duplicado de [red de bucle de sincronización Prevent al sincronizar desde la red en Android ContentProvider] (http://stackoverflow.com/questions/6588770/prevent-network-sync-loop-when-syncing-from-network -in-android-contentprovider) – jcwenger

Respuesta

14

Te estás perdiendo una gran cantidad de código que hay, es difícil encontrar el problema cuando no nos dice lo que usted' re haciendo

salir en una extremidad con una pista sobre sus problemas ...

¿Alguno addTimeStamp() o los distintos servicios que se crean modificar los datos almacenados en su ContentProvider?

Si es así, ¿su proveedor de contenido llama al ContentResolver.notifyChange(uri, null)?

Si es así, su ContentProvider notifica a Android que ha cambiado y necesita una sincronización, lo que genera un bucle.

La API es notifyChange (Uri uri, ContentObserver observer, boolean syncToNetwork). necesita llamar con notifyChange(uri, null, false); - Esto indica que ha sacado un cambio de la red y que no debe ser devuelto a la red, rompiendo así el ciclo.

+0

+1 me salvaste de enloquecer por completo ... No pude entenderlo porque el código de notifychange estaba enterrado profundamente en secreto;) – Merlin

0

cuando tenemos ContentObserver registrado, el adaptador de sincronización entrará en el bucle incluso después de configurar syncToNetwork como falso.

notifyChange(uri, null, false);