2011-08-16 19 views
5

Piszę adapter synchronizacji z Androidem i zasadniczo mam problem z synchronizacją w nieskończonej pętli. Po zakończeniu synchronizacji zaczyna się od nowa.Android SyncAdapter utknął w nieskończonej pętli synchronizacji

Dziękuję

Pozdrowienia,

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

możliwe duplikat [Zapobieganie sieci synchronizacji pętli przy synchronizacji z siecią Android ContentProvider] (http://stackoverflow.com/questions/6588770/prevent-network-sync-loop-when-syncing-from-network -in-android-contentprovider) – jcwenger

Odpowiedz

14

Brakuje dużo kodu tam, trudno znaleźć problemu, jeśli nie powiedzieć nam, co” Robię to ponownie.

Wychodzisz na kończynie z domyślać się swoimi problemami ...

Wykonaj jedną addTimeStamp() lub różne usługi tworzone zmodyfikować dane zapisane w ContentProvider?

Jeśli tak, czy Twój użytkownik ContentProvider wywołuje ContentResolver.notifyChange(uri, null)?

Jeśli tak, Twój dostawca treści powiadamia Androida, że ​​uległo zmianie i wymaga synchronizacji, a tym samym uruchomienia pętli.

Interfejs API to notifyChange (Uri uri, ContentObserver observer, boolean syncToNetwork). musisz zadzwonić pod numer notifyChange(uri, null, false); - Oznacza to, że wprowadziłeś zmianę z sieci i że nie powinna ona być wypychana z powrotem do sieci, co powoduje przerwanie pętli.

+0

+1 uratowałeś mnie przed całkowitym szaleństwem ... Nie mogłem tego rozgryźć, ponieważ kod notifychange został głęboko zakryty;) – Merlin

0

Po zarejestrowaniu ContentObserver adapter synchronizacji uruchomi się nawet po ustawieniu wartości syncToNetwork jako false.

notifyChange(uri, null, false); 
Powiązane problemy