2011-08-16 17 views
5

मैं एक एंड्रॉइड सिंक एडाप्टर लिख रहा हूं और मूल रूप से एक अनंत लूप में समन्वयित करने में समस्या है। जैसे ही सिंक पूरा हो जाता है, यह फिर से शुरू होता है।एंड्रॉइड सिंक एडाप्टर अनंत सिंक लूप में फंस गया

धन्यवाद,

सादर,

अक्षय

@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 -इन-एंड्रॉइड-कंटेंटप्रोवाइडर) – jcwenger

उत्तर

14

आप कोड का एक बहुत कुछ भूल रहे हैं, आपकी समस्या को खोजने के लिए जब आप हमें बता नहीं है कठिन है कि तुम क्या ' कर रहा हूँ

अपनी समस्याओं पर कोई अनुमान के साथ एक अंग पर बाहर जा रहे हैं ...

करो या तो addTimeStamp() या विभिन्न सेवाओं आप अपने ContentProvider में संग्रहीत डेटा को संशोधित बनाने?

यदि ऐसा है, तो क्या आपका ContentProvider ContentResolver.notifyChange(uri, null) पर कॉल करता है?

यदि ऐसा है, तो आपका ContentProvider एंड्रॉइड को सूचित करता है कि यह बदल गया है और एक सिंक की आवश्यकता है, इस प्रकार एक लूप चला रहा है।

एपीआई notifyChange (Uri uri, ContentObserver observer, boolean syncToNetwork) है। आपको notifyChange(uri, null, false); के साथ कॉल करने की आवश्यकता है - यह इंगित करता है कि आपने नेटवर्क से एक बदलाव खींचा है और इसे नेटवर्क पर वापस धक्का नहीं दिया जाना चाहिए, इस प्रकार लूप को तोड़ना चाहिए।

+0

+1 आपने मुझे पूरी तरह से पागल होने से बचाया ... मैं इसे समझ नहीं पाया क्योंकि अधिसूचना कोड को गहरे गहरे अंडरवर्कर को दफनाया गया था;) – Merlin

0

जब हमारे पास ContentObserver पंजीकृत है, सिंक एडाप्टर सिंक ToNetwork को गलत के रूप में सेट करने के बाद भी लूप में जाएगा।

notifyChange(uri, null, false); 
[रोकें नेटवर्क सिंक पाश जब एंड्रॉयड ContentProvider में नेटवर्क से सिंक करना] (की
संबंधित मुद्दे