Android में डेटा सिंक करने के लिए डिज़ाइन


23

मैं अधिकांश एप्लिकेशन पर सर्वर और क्लाइंट के बीच डेटा को सिंक्रनाइज़ करने के लिए दो कार्यान्वयन देख रहा हूं। यह माना जाता है कि कोई GCM सेट नहीं है: -

  1. एक इरादे सेवा को समय-समय पर चलाना जो नेटवर्क से डेटा डाउनलोड करता है और डेटाबेस में संग्रहीत करता है।
  2. एक सिंक एडॉप्टर लागू करना जो समय-समय पर चलता है।

उपरोक्त में से कौन सा आप अपने ऐप में रखने की सलाह देंगे और क्यों?

जवाबों:


12

नोट: सिंक एडेप्टर एसिंक्रोनस रूप से चलते हैं, इसलिए आपको उन्हें इस उम्मीद के साथ उपयोग करना चाहिए कि वे नियमित और कुशलता से डेटा स्थानांतरित करते हैं, लेकिन तत्काल नहीं। यदि आपको वास्तविक समय डेटा ट्रांसफर करने की आवश्यकता है, तो आपको इसे AsyncTask या IntentService में करना चाहिए। - स्रोत

मूल रूप से, यदि आपको वास्तविक समय हस्तांतरण की आवश्यकता है IntentService (पहला विकल्प) का उपयोग करें, तो SyncAdapter। मैं एक IntentService पसंद करता हूँ, क्योंकि यह अधिक अनुकूलन योग्य लगता है, लेकिन एक अधिक तुच्छ दृष्टिकोण एक सिंक एडेप्टर का उपयोग करना होगा।


18

यह बहुत हद तक इस बात पर निर्भर करता है कि आपको किस तरह के सिंकिंग की ज़रूरत है।

सामयिक

यदि आपका ऐप एक समाचार ऐप है जो हर दिन एक निश्चित समय पर पोस्ट प्रकाशित करता है (हर दिन 7.45 बजे कहते हैं), तो आप एक पृष्ठभूमि सेवा में एक आवधिक कार्य चलाते हैं, 8 बजे कहते हैं।

जैसे : ड्रिपलर। वे हर दिन (लगभग 6.30 बजे) मुझे एक बार सूचित करते हैं। मेरा मानना ​​है कि वे एक आवधिक कार्य का उपयोग करते हैं।

घटना की शुरुआत की गई

यदि आपका डेटा स्थानांतरण उपयोगकर्ता की कार्रवाई से चालू होता है, तो डेटा ट्रांसफर के लिए पृष्ठभूमि सेवा या AsyncTask का उपयोग करें।

उदाहरण : ड्रॉपबॉक्स / एवरनोट। जब मैं ऐप के साथ इंटरैक्ट करता हूं तो वे सिंक हो जाते हैं।

तात्कालिक

यदि आपका ऐप इंस्टेंट मैसेजिंग / मेल / नॉन-पीरियडिक महत्वपूर्ण अपडेट चलाता है , तो आपको पुश नोटिफिकेशन की आवश्यकता है, क्योंकि आप उपयोगकर्ता को तुरंत अलर्ट करना चाहते हैं। इस मामले के लिए या तो GCM या पार्स का उपयोग करें। उदाहरण: व्हाट्सएप / गूगल चैट। चूंकि आपने स्पष्ट रूप से उल्लेख किया है कि आप GCM का उपयोग नहीं करना चाहते हैं, इसलिए मैं बताऊंगा कि आपको अपना लिखने के बजाय मानक पुश सूचना प्रदाता का उपयोग क्यों करना चाहिए :

पुश सूचनाएं तुरंत काम करती हैं - बहुत कम देरी होती है (सेकंड के क्रम में, शायद ही कभी मिनट)। यदि आप ऐसा करने के लिए अपने स्वयं के समाधान / पुस्तकालय को लागू करने के लिए थे - एक भोले मॉडल में, आप स्थिति की जांच करने के लिए हर दूसरे या 5 सेकंड या एक मिनट में सर्वर को पिंग करेंगे। यह बहुत अक्षम है क्योंकि यह सीपीयू (और इसलिए बैटरी), मोबाइल पर बैंडविड्थ और आपके सर्वर पर लोड की खपत करता है। हालाँकि, GCM / Parse में, वे हमेशा सर्वर के साथ एक पोर्ट खुला रखते हैं ( यहाँ देखें )। यह मानक और सबसे कुशल तरीका है। साथ ही, यदि 10 ऐप्स GCM का उपयोग करते हैं, तो आपको 10 खुले कनेक्शन की आवश्यकता नहीं है, आपको केवल एक डिवाइस की आवश्यकता है। और आप वास्तव में अपना समाधान विकसित नहीं करना चाहते हैं जब तक कि आपके पास ऐसा करने के लिए कोई वैध कारण / धन / समय न हो।

सिंक एडॉप्टर पर एक नोट : सिंक एडॉप्टर उपरोक्त सभी तीन मामलों के लिए अच्छी तरह से काम करता है। एक सिंक एडप्टर चलाने की जाँच करें और आप देखेंगे कि यह या तो जीसीएम या आपके स्वयं के तंत्र (ईवेंट ट्रिगर या कस्टम समाधान) या नेटवर्क उपलब्धता (ईवेंट ट्रिगर) या आवधिक घटना पर निर्भर करता है। सभी के सभी, यह हर बार इनिशियलाइज़ेशन की एक लंबी सूची के बिना या एक ही स्थान पर उपरोक्त सभी मामलों को लागू करने के लिए डेटा को सिंक्रनाइज़ करने के लिए एक अच्छा सुविधाजनक वर्ग है।


एक विस्तारित प्रश्न के रूप में, अगर मुझे मैच के लाइव स्कोर को अपडेट करने की आवश्यकता है, तो क्या तात्कालिक परिदृश्य इस संदर्भ के लिए सही है? मेरे पास एक स्क्रीन है जिसमें मैच का विवरण है और जब उपयोगकर्ता उस स्क्रीन पर होता है, तो स्कोर को बिना सिंक या मैनुअल अपडेट के अपने आप अपडेट हो जाना चाहिए। तो क्या gcm सही कदम होगा?
गारा87

@ आकाशवाणी मैं इस कारण के लिए GCM / Parse का उपयोग नहीं करना चाहिए। हालाँकि, GCM मुफ़्त है जबकि Parse आपको एक निश्चित बिंदु से परे बिल करता है। यदि आपके अपडेट 4096 बाइट्स के भीतर हैं, तो आप सीधे अपडेट भेज सकते हैं। यदि आपके स्कोर अपडेट बहुत अक्सर होते हैं, तो जीसीएम (क्रिकेट स्कोर के लिए) के बजाय मतदान एक अच्छा विचार हो सकता है। मैं विलंबता और सीपीयू / बैटरी की खपत के लिए मतदान और जीसीएम दोनों का परीक्षण / प्रोफाइल करने का सुझाव दूंगा।
संदीप

AWS के पास एक अधिसूचना समाधान भी है जो क्रॉस प्लेटफॉर्म और क्रॉस मार्केट है। देखें: docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill Pappin

3

इसका एक पहलू है SyncAdapterजिसका उल्लेख अन्य उत्तरों द्वारा नहीं किया गया है।

SyncAdapterपैटर्न की आवश्यकता है आप एक विशिष्ट है ContentProvider अधिकार है कि आप करने के लिए सिंक और एक विशिष्ट खाता प्रकार (देखें प्रमाणक ) समन्वयित की जाने जा रहा है। इसलिए जब तक आपके पास पहले से ही आपके आर्किटेक्चर में वे घटक नहीं हैं (उदाहरण के लिए, क्योंकि आप अन्य ऐप्स को अपने डेटा तक पहुंच देते हैं या आपको खातों का समर्थन करने की आवश्यकता होती है) एक SyncAdapterमहत्वपूर्ण कार्यान्वयन का कारण होगा।


2

जब यह डेटा सिंक करने की बात आती है, जिसमें कनेक्टिविटी शामिल है, तो आप स्केल भी कर सकते हैं। मेरा मानना ​​है कि इसके बारे में जाने के लिए अनुशंसित तरीका सिंक एडाप्टर का उपयोग कर रहा है।

यह उस तरह से भी लगता है यदि आप एंड्रॉइड ट्रानिंग गाइड की जांच करते हैं: एक सिंक एडेप्टर बनाना

आपके ऐप में सिंक एडाप्टर घटक उन कार्यों के लिए कोड को एन्क्रिप्ट करता है जो डिवाइस और सर्वर के बीच डेटा ट्रांसफर करते हैं। शेड्यूलिंग और ट्रिगर के आधार पर आप अपने ऐप में प्रदान करते हैं, सिंक एडेप्टर फ्रेमवर्क सिंक एडेप्टर घटक में कोड चलाता है ...


2

सिंक एडेप्टर का उपयोग तब तक किया जाना चाहिए जब तक कि आपको वास्तविक समय डेटा की आवश्यकता न हो, क्योंकि यह विभिन्न प्रकारों के आधार पर डेटा ट्रांसफर को स्वचालित करता है, जैसे डेटा परिवर्तन, बीता हुआ समय, दिन का समय, आदि। यह सभी डेटा ट्रांसफर को केंद्रीकृत करता है जिससे आपका डेटा ट्रांसफ़र होता है। डेटा अन्य ऐप्स से स्थानांतरित होता है, जो बैटरी उपयोग को कम करता है।

तात्कालिक कार्यों के लिए हम उपयोग कर सकते हैं,

कार्य के लिए AsyncTask जो कि छोटी अवधि के होते हैं, 3-4 सेकंड के हो सकते हैं।

लंबे समय से चल रहे कार्यों के लिए इंटेंटसेवा


अंगूठे के चुनाव के नियम के लिए महान टूट।
ब्रिल पप्पिन

0

चूँकि हम डिज़ाइन के बारे में बात कर रहे हैं, हमें सिंक एडेप्टर, सिंक्रोनाइज़ ऑब्जेक्ट का प्रबंधन करना चाहिए, और उसके बाद क्या होता है।

मैं वास्तव में अपने सर्वर को IntentService वेब कॉल करने के लिए अपनी लाइब्रेरी को बताने के लिए SyncAdapter का उपयोग करता हूं। इस "सिंक" ऑपरेशन को प्रबंधित करना मुश्किल है।

अब मैं जो एक दृष्टिकोण ले रहा हूं वह पूरी तरह से SyncResult ऑब्जेक्ट को छोड़ देना है और प्रत्येक "सिंक" के परिणामों को लॉग करने के लिए एक सेवा का उपयोग करना है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.