2011-08-16 32 views
5

Tôi đang viết Bộ điều hợp Android Sync và về cơ bản có sự cố với đồng bộ hóa trong vòng lặp vô hạn. Ngay sau khi đồng bộ hoàn thành, nó bắt đầu lại từ đầu.Android SyncAdapter bị kẹt trong vòng lặp đồng bộ vô hạn

Cảm ơn bạn,

Kính trọng,

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

thể trùng lặp của [Ngăn chặn mạng đồng bộ vòng lặp khi đồng bộ hoá từ mạng trong Android ContentProvider] (http://stackoverflow.com/questions/6588770/prevent-network-sync-loop-when-syncing-from-network -in-android-contentprovider) – jcwenger

Trả lời

14

Bạn đang thiếu rất nhiều mã có, khó có thể tìm thấy vấn đề của bạn khi bạn không cho chúng tôi biết những gì bạn' đang làm.

Đi ra ngoài ở cánh với một đoán vấn đề của mình ...

Thực hiện một addTimeStamp() hoặc các dịch vụ khác nhau mà bạn tạo sửa đổi dữ liệu lưu trữ trong ContentProvider của bạn?

Nếu có, trình ContentProvider của bạn có gọi số ContentResolver.notifyChange(uri, null) không?

Nếu vậy, ContentProvider của bạn thông báo cho Android rằng nó đã thay đổi và cần đồng bộ hóa, do đó lái xe vòng lặp.

API là notifyChange (Uri uri, ContentObserver observer, boolean syncToNetwork). bạn cần gọi số notifyChange(uri, null, false); - Điều này cho biết rằng bạn đã kéo một thay đổi từ mạng và không được đẩy trở lại mạng, do đó sẽ phá vỡ vòng lặp.

+0

+1 bạn đã cứu tôi khỏi việc hoàn toàn điên rồ ... Tôi không thể hiểu được vì mã thông báo đã được chôn sâu sâu bí mật;) – Merlin

0

khi chúng tôi đã đăng ký ContentObserver, bộ điều hợp đồng bộ sẽ đi vào vòng lặp ngay cả sau khi đặt syncToNetwork là sai.

notifyChange(uri, null, false); 
Các vấn đề liên quan