2011-08-16 113 views
5

我正在寫一個Android同步適配器,基本上有一個問題,它在無限循環中同步。只要同步完成,它就會重新開始。Android SyncAdapter陷入無限同步循環

謝謝

問候,

阿克沙伊

@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

可能重複http://stackoverflow.com/questions/6588770/prevent-network-sync-loop-when-syncing-from-network -in-Android的ContentProvider的) – jcwenger

回答

14

你錯過了很多代碼在那裏,很難找到自己的問題,當你不告訴我們你的」重新做。

走出去的肢體與你的問題的猜測......

執行下列任addTimeStamp()或創建修改存儲在您的ContentProvider數據的各種服務?

如果是這樣,你的ContentProvider調用ContentResolver.notifyChange(uri, null)

如果是這樣,您的ContentProvider會通知Android它已更改並需要同步,從而驅動一個循環。

API是notifyChange (Uri uri, ContentObserver observer, boolean syncToNetwork)。您需要撥打電話notifyChange(uri, null, false); - 這表示您已從網絡中撤消更改,並且不應將其推回到網絡,從而打破循環。

+0

+1你打算徹底瘋狂救了我......我不能算出它,因爲有NotifyChange代碼被深埋深臥底;) – Merlin

0

當我們ContentObserver註冊,同步適配器甚至會設置syncToNetwork假進去後循環。

​​ [Android中的ContentProvider從網絡同步時防止網絡同步環(的