2016-02-09 10 views
10

मेरे पास SyncAdapter के साथ एक एप्लिकेशन है।SyncManager द्वारा बंडल कितने समय तक जारी रहते हैं?

Bundle settingsBundle = new Bundle(); 
settingsBundle.putString(SyncAdapter.USER_READ, uid); 
ContentResolver.requestSync(account, authority, settingsBundle); 

यह सही ढंग से भविष्य में कुछ समय मेरी तुल्यकालन दिनचर्या कॉल करेंगे: इसके अतिरिक्त सामान्य तुल्यकालन के लिए मैं एक USER_READ घटना है जिसके साथ मैं सिर्फ यह बने बिना एडाप्टर के लिए एक Bundle पारित ट्रिगर। में सेट प्रत्येक uid अपना स्वयं का रन ट्रिगर करेगा और सब कुछ अपेक्षित के रूप में समन्वयित हो जाएगा।

तो अब कनेक्शन बुरा है, या अनुरोध समयबाह्य हो, तो मैं एक नरम त्रुटि सेट:

syncResult.stats.numIoExceptions += 1; 

जो कारण होगा अनुरोध बाद में दोहराया जाना। यह भी ठीक काम करता है।


कब तक इन SyncRequests/बंडल कायम मिलता है?

प्रलेखन राज्यों, जो एक नरम त्रुटि का सामना कर रहे हैं, एक एक्सपोनेशनल बैकऑफ का कारण बनेंगे और सिंक कुछ समय बाद चलाया जाएगा।

  • क्या इसे किसी बिंदु पर रद्द कर दिया जाएगा? कई मुलायम त्रुटियों के बाद?
  • क्या डिवाइस के रीबूट के बाद इसे फिर से लगाया जाएगा?

को देखते हुए कनेक्शन खराब है और तुल्यकालन नरम त्रुटियों के साथ कई बार विफल रहता है: मुझे पता है कि अगर सिर्फ एक सिंक अनुरोध enqueuing पर्याप्त है चाहते हैं, या अगर मैं अपने आप को दृढ़ता के कुछ प्रकार प्रदान करने के लिए सुनिश्चित करने के लिए अनुरोध किया जा रहा है किसी बिंदु पर भेजा गया।

+0

यह आपकी आवश्यकता पर निर्भर करता है कि यह तब होगा जब सिस्टम नेटवर्क संदेश भेजता है, नियमित अंतराल पर, डिवाइस की रीबूट के बाद मांग पर http://developer.android.com/training/sync-adapters /running-sync-adapter.html –

+0

@WaqasAhmed धन्यवाद, हाँ। मुझे दस्तावेज पता है। मैं बस विनिर्देशों के बारे में सोचता हूं कि ये अनुरोध कब तक जारी रहेगा, खासकर यदि मैं केवल * पूर्ण सिंक * का उपयोग नहीं करता हूं लेकिन बंडलों से डेटा की आवश्यकता है –

उत्तर

7

मुझे आपके प्रश्न का उत्तर खोजने के लिए एंड्रॉइड रनटाइम स्रोत में खोदना पड़ा। आइए प्रश्न के पहले भाग से शुरू करें।

Will it [sync] be canceled at some point? After multiple soft errors?

और जवाब है शायद नहीं, तो निम्न स्थितियों में से एक है जब तक पूरा किया जाता है:

  • सिंक रद्द कर दिया गया
  • आप SyncManager पूछना सिंक फिर से शेड्यूल नहीं ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY
  • साथ SyncAdapter शुरू करने से आप SyncResult.tooManyRetries से true पर सेट करें और सिंक अपलोड नहीं है केवल
  • आपसेट करते हैं true को, SyncStats.numInserts या SyncStats.numUpdates गैर शून्य मान के लिए सेट नहीं है, और सिंक अपलोड-केवल नहीं है
  • सिंक कोई नरम त्रुटियाँ हैं लेकिन कुछ कठिन त्रुटियों, और इसे अपलोड-केवल
  • सिंक रन नहीं कर रहा है के लिए 30 मिनट से अधिक
  • सिंक से अधिक 1 मिनट के लिए नेटवर्क का उपयोग नहीं करता

तो कई नरम त्रुटियों सिंक रद्द नहीं करते और यहाँ क्यों है।

सभी सिंक घटनाओं को संभालना SyncManager.SyncHandler.handleMessage() विधि में शुरू होता है और SyncManager.runSyncFinishedOrCanceledH() विधि में जारी रहता है। runSyncFinishedOrCanceledH() का पहला तर्क SyncResult है, जो null हो सकता है। यह null या तो सिंक समाप्त होने पर या SyncAdapter सेवा डिस्कनेक्ट नहीं है, जो एक नरम त्रुटि है। और यह null है जब सिंक रद्द हो जाता है, समाप्त हो जाता है (30 मिनट से अधिक चलाता है), 1 मिनट से अधिक समय तक नेटवर्क का उपयोग नहीं कर रहा है, और दूसरे मामले में मैं पूरी तरह से समझ नहीं पा रहा हूं।

मामले SyncResult में null और सिंक त्रुटियों के साथ समाप्त नहीं हुआ है, SyncManagermaybeRescheduleSync() फोन करके सिंक को पुनर्निर्धारित करने के लिए कोशिश करता है। यह विधियां कुछ ध्वज और सिंक परिणाम की जांच करती हैं, जैसे ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY और SyncResult.tooManyRetries यह तय करें कि इसे सिंक को फिर से निर्धारित करने की आवश्यकता है या नहीं। और SyncManager के बाद यह जांच करता है कि सिंक एक नरम त्रुटि syncResult.hasSoftError() के साथ समाप्त हुआ है, यह बिना किसी अतिरिक्त चेक के सिंक को रीशेड्यूल करता है।

और अब सवाल का दूसरा भाग।

Will it [sync] be enqueued again after a reboot of the device?

हाँ, यह होगा। जब SystemServer प्रारंभ होता है, तो यह ContentService बनाता है और उसके बाद systemReady() विधि को कॉल करता है, जो इसकी बारी में SyncManager बनाता है। SyncManager अपने कन्स्ट्रक्टर में SyncStorageEngine बनाता है, जो reads all pending operations अपने कन्स्ट्रक्टर including extra bundles में बनाता है। यही कारण है कि सिंक बंडलों में अनुमत प्रकारों का एक सेट बहुत सीमित है। और जब उपयोगकर्ता SyncQueue.addPendingOperations() पर कॉल करके सभी लंबित परिचालन शुरू कर रहे हैं SynqQueue में जोड़े गए हैं।

यह उत्तर एंड्रॉइड कोड के मेरे विश्लेषण का नतीजा है, इसलिए मैं इसकी 100% सही गारंटी नहीं दे सकता। लेकिन आप इस जानकारी का उपयोग अपने स्वयं के शोध के लिए शुरुआती बिंदु के रूप में कर सकते हैं।

+0

यह वह उत्तर था जिसे मैं ढूंढ रहा था, धन्यवाद! –

संबंधित मुद्दे