2015-05-30 5 views
7

का उपयोग करते समय प्रारंभिक रूप से समन्वयित करने के लिए सिंक एडाप्टर को रोकें, मैं अपने प्रोजेक्ट में एक सिंक एडाप्टर का उपयोग कर रहा हूं जो समय-समय पर सिंक हो जाएगा। सिंक एडाप्टर के लिए खाता बनाने के लिए मैं नीचे दिए गए कोड का उपयोग कर रहा हूं।addPeriodicSync

मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि यह कोड प्रारंभिक सिंक ट्रिगर कर रहा है। प्रलेखन में कोई उल्लेख नहीं किया गया है कि यह कोड सिंक को प्रारंभ में चलाने के लिए बनाएगा।

वास्तव में यहां तक ​​कि Google नमूना प्रोजेक्ट में भी प्रारंभिक सिंक को ट्रिगर करने के लिए अतिरिक्त कोड है जिसे मैंने हटा दिया है।

मैं इस नमूने से कोड का इस्तेमाल किया है: http://developer.android.com/samples/BasicSyncAdapter/index.html

यहां तक ​​कि अगर मैं आदेश ContentResolver.cancelSync (खाते, नल) जोड़ने; सिंक एडाप्टर अभी भी चलाता है।

मैं सिंक एडाप्टर को प्रारंभ में सिंक करने से कैसे रोक सकता हूं। सिंक अंतराल अवधि बीत जाने पर पहली बार सिंक करना चाहिए।

Account account = new Account(context.getPackageName(), context.getPackageName()); 

AccountManager accountManager = (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE); 

if (accountManager.addAccountExplicitly(account, null, null)) { 

     // Inform the system that this account supports sync 
     ContentResolver.setIsSyncable(account, context.getPackageName(), 1); 

     // Inform the system that this account is eligible for auto sync when the network is up 
     ContentResolver.setSyncAutomatically(account, context.getPackageName(), true); 

     // Recommend a schedule for automatic synchronization. 
     // The system may modify this based 
     // on other scheduled syncs and network utilization. 
     ContentResolver.addPeriodicSync(account, context.getPackageName(), 
       Bundle.EMPTY, AppConstants.SYNC_INTERVAL); 
} 

उत्तर

0

आप पहली बार मैन्युअल सिंक के बाद भविष्य की घटना को शेड्यूल कर सकते हैं।

private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

private void setDelayedAutoSync() { 
      ScheduledFuture<?> countdown = scheduler.schedule(new Runnable() { 
      @Override 
      public void run() { 
       Log.d(TAG, "Out of time!"); 
       ContentResolver.setSyncAutomatically(account, content_authority, true); 
       ContentResolver.addPeriodicSync(account, content_authority, new Bundle(),SYNC_FREQUENCY_CONSTANT); 
     }, SYNC_FREQUENCY_CONSTANT, TimeUnit.SECONDS); 
    } 
0

प्रारंभिक सिंक स्पष्ट रूप से खाता जोड़ने के परिणामस्वरूप होता है।

if (accountManager.addAccountExplicitly(account, null, null)) 

सिंक एडाप्टर द्वारा भेजे गए एक प्रसारण को जब भी सिंक को ट्रिगर करने वाले खाते को जोड़/हटाया जाता है। कृपया SyncManager स्रोत वर्ग देखें।

इसे ऑनफॉर्म सिंक() पर पास किए गए बंडल में एक विशिष्ट कुंजी जोड़कर बचाया जा सकता है और रिक्त बंडल भेजने के बजाय सिंक को ट्रिगर करने के लिए इसकी जांच कर सकते हैं।

Bundle bundle = new Bundle(); 
    bundle.putBoolean("MySync", true); 
    ContentResolver.addPeriodicSync(account, context.getPackageName(), 
      bundle, AppConstants.SYNC_INTERVAL); 
    .... 


    onPerformSync(...) { 
     if(bundle.containsKey("MySync")) { 
     //perform your sync 
     } 
    }