साझाकरण में प्रतिबद्ध () और लागू () के बीच क्या अंतर है


431

मैं SharedPreferencesअपने एंड्रॉइड ऐप में उपयोग कर रहा हूं । मैं साझा प्राथमिकता से दोनों commit()और apply()विधि का उपयोग कर रहा हूं । जब मैं AVD 2.3 का उपयोग करता हूं तो यह कोई त्रुटि नहीं दिखाता है, लेकिन जब मैं AVD 2.1 में कोड चलाता हूं, तो apply()विधि त्रुटि दिखाती है।

तो इन दोनों में क्या अंतर है? और केवल commit()उपयोग करने से मैं बिना किसी समस्या के वरीयता मूल्य स्टोर कर सकता हूं?


115
यह एक वर्ष पुराना है, लेकिन मैं इस पर वैसे भी टिप्पणी करने जा रहा हूं, हालांकि यह स्पष्ट हो सकता है, कोई भी उत्तर इस बिंदु को नहीं बनाता है: तुल्यकालिक रूप से apply()डिस्क I / O होगा जबकि commit()तुल्यकालिक है। इसलिए आपको वास्तव commit()में UI थ्रेड से कॉल नहीं करना चाहिए ।
मचिअकिग

ध्यान दें, जब कई SharedPreferences.Editor ऑब्जेक्ट्स उपयोग में हैं, तो आखिरी कॉल apply()जीतता है। इसलिए, आप सुरक्षित रूप से apply()बदले में उपयोग कर सकते हैं commit()यदि आप यह सुनिश्चित करते हैं कि केवल एक SharedPreferences.Editor आपके एप्लिकेशन द्वारा उपयोग किया जा रहा है।
अन्नू

2
एंड्रॉइड स्टूडियो लिंट चेतावनी के अनुसार: प्रतिबद्ध () तुरंत और तुल्यकालिक रूप से डेटा बचाएगा। हालाँकि, लागू () इसे अतुल्यकालिक (पृष्ठभूमि में) बचाएगा और इस तरह कुछ प्रदर्शन में सुधार होगा। इसीलिए लागू करें () को कमिटेड ओवर पसंद किया जाता है () अगर आपको इसके रिटर्न टाइप की परवाह नहीं है (यदि डेटा सफलतापूर्वक बचा है या नहीं)।
राहुल रैना

उपयोग करते समय लिंट चेतावनी को अक्षम करने का एक तरीका है commit()?
QED

जवाबों:


653

apply()2.3 में जोड़ा गया था, यह सफलता या विफलता का संकेत देने वाले बूलियन को लौटाए बिना करता है ।

commit()रिटर्न सच अगर काम करता है को बचाने, झूठी अन्यथा।

apply() जोड़ा गया था क्योंकि एंड्रॉइड देव टीम ने देखा था कि लगभग किसी ने रिटर्न वैल्यू पर ध्यान नहीं दिया है, इसलिए यह अतुल्यकालिक है क्योंकि यह तेजी से लागू होता है।

http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply ()


8
यह उत्तर सही है, लेकिन मुझे लगता है कि @spacemanaki की टिप्पणी ऊपर भी सच है जिसमें बहुमूल्य जानकारी है
अक्सेल फतह

58
प्रतिबद्ध () अपने डेटा को लगातार स्टोरेज को तुरंत लिखता है, जबकि लागू () पृष्ठभूमि में इसे संभाल लेगा।
capt.swag

18
क्या यह एक दौड़ की स्थिति पैदा करता है?
क्रिसमजवा

42
यदि मैं आवेदन () के साथ कुछ लिखता हूं और इसके तुरंत बाद पढ़ने की कोशिश करता हूं तो क्या होगा? क्या मुझे नवीनतम मूल्य देने के लिए रीड की गारंटी है? डॉक्स का कहना है कि अगर आपके द्वारा लागू किए जाने के बाद एक और कमिट () होता है, तो वह कमिट () लागू होने तक अवरुद्ध हो जाएगी () डिस्क के लिए बनी रहती है, जो यह स्पष्ट करती है कि यह समस्या तब नहीं होती है जब यह 'राइट' ऑपरेशन्स में आता है। , लेकिन क्या होगा अगर आप तुरंत बाद लिख रहे हैं और पढ़ रहे हैं? मेरे परीक्षणों से, नवीनतम मूल्य वापस आ गया है, लेकिन मैं जानना चाहता हूं कि यह 100% गारंटी है या नहीं।
टियागो

22
यह लागू होने के साथ ही किसी भी तरह की प्रतिबद्धता () को सुरक्षित करने के लिए सुरक्षित है। डेवलपर
।android.com/reference/android/content/…

221

tl; डॉ:

  • commit()डेटा को समकालिक रूप से लिखता है (इसके द्वारा भेजे गए थ्रेड को ब्लॉक करना)। यह आपको ऑपरेशन की सफलता के बारे में सूचित करता है
  • apply()डेटा को एसिंक्रोनस रूप से लिखे जाने का शेड्यूल करता है । यह आपको ऑपरेशन की सफलता के बारे में सूचित नहीं करता है
  • यदि आप किसी भी गेट-पद्धति के माध्यम से बचत करते हैं apply()और तुरंत पढ़ते हैं , तो नया मान वापस आ जाएगा!
  • यदि आपने apply()किसी बिंदु पर कॉल किया है और यह अभी भी निष्पादित हो रहा है, तो commit()सभी कॉल पिछले एप्लिकेशन-कॉल और वर्तमान प्रतिबद्ध-कॉल समाप्त होने तक ब्लॉक हो जाएंगे ।

SharedPreferences.Editor प्रलेखन से अधिक गहराई से जानकारी :

कमिट () के विपरीत , जो अपनी प्राथमिकताओं को लगातार स्टोरेज के लिए सिंक्रोनाइज़ करता है, इन-मेमोरी शेयर्डप्रिफरेंस में इसके बदलाव तुरंत लागू करता है , लेकिन डिस्क पर एसिंक्रोनस कमिट शुरू कर देता है और आपको किसी भी विफलता के बारे में सूचित नहीं किया जाएगा । यदि इस SharedPreferences पर एक अन्य संपादक एक नियमित रूप से प्रतिबद्ध () करता है, जबकि एक आवेदन () अभी भी बकाया है, तो प्रतिबद्ध () तब तक अवरुद्ध हो जाएगा जब तक कि सभी async के पूरा होने के साथ-साथ प्रतिबद्ध भी।

SharedPreferences उदाहरण एक प्रक्रिया के भीतर एकल हैं, इसलिए यदि आप पहले से ही रिटर्न वैल्यू को अनदेखा कर रहे हैं तो लागू () के साथ कमिट ()) के किसी भी उदाहरण को बदलना सुरक्षित है।

SharedPreferences.Editor इंटरफ़ेस को सीधे लागू किए जाने की उम्मीद नहीं है। हालांकि, अगर आपने पहले इसे लागू किया था और अब लापता आवेदन () के बारे में त्रुटियां हो रही हैं, तो आप बस लागू () से कमिट () कर सकते हैं।


19
यह एक बेहतर उत्तर है क्योंकि यह उल्लेख है कि apply()अतुल्यकालिक है और लंबित लिखता है भविष्य के कॉल को ब्लॉक करता है commit()
स्पाकार्की

22

मैं कुछ समस्याओं का उपयोग कर रहा हूँ () के बजाय प्रतिबद्ध () का उपयोग कर रहा हूँ। जैसा कि अन्य प्रतिक्रियाओं में पहले कहा गया है, लागू () अतुल्यकालिक है। मुझे यह समस्या हो रही है कि "स्ट्रिंग सेट" वरीयता के लिए किए गए परिवर्तन लगातार स्मृति को कभी नहीं लिखे जाते हैं।

यह तब होता है जब आप प्रोग्राम के "जबरदस्ती निरोध" या, ROM में जो मैंने अपने डिवाइस पर एंड्रॉइड 4.1 के साथ स्थापित किया है, जब स्मृति आवश्यकताओं के कारण सिस्टम द्वारा प्रक्रिया को मार दिया जाता है।

यदि आप अपनी प्राथमिकताएं चाहते हैं तो मैं "कमिट ()" के बजाय "लागू" () "" का उपयोग करने की सलाह देता हूं।


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

स्ट्रिंग सेट के बारे में, stackoverflow.com/questions/16820252/…
Tapirboy

@JoseLSegura - डॉक्स अन्यथा सुझाव देते हैं: developer.android.com/intl/ja/reference/android/content/… "आपको Android घटक जीवनचक्र के बारे में चिंता करने की आवश्यकता नहीं है और डिस्क के साथ उनके () लेखन के साथ बातचीत। स्विच करने से पहले इन-फ्लाइट डिस्क लिखती है (राज्यों को पूरा करने से पहले)। मुझे आश्चर्य हो रहा है कि क्या आप देख रहे हैं कि एंड्रॉइड में एक बग है, और यदि ऐसा है तो क्या यह नए संस्करणों में तय किया गया है।
टूलमेकरसैट

मेरे ऐप को रीसेट करने के लिए लाइब्रेरी "प्रोसेपोहेनिक्स" का उपयोग करते हुए बहुत ही समस्या मुझे परेशान कर रही थी। मैं रीसेट करने से पहले एक वरीयता को सहेज रहा था, और "लागू" काम नहीं कर रहा था।
एलियन

14

उपयोग लागू करें ()।

यह रैम में बदलावों को तुरंत लिखता है और इंतजार करता है और उसके बाद आंतरिक भंडारण (वास्तविक वरीयता फ़ाइल) पर लिखता है। प्रतिबद्ध परिवर्तन को तुल्यकालिक और सीधे फाइल में लिखता है।


14
  • commit()समकालिक है, apply()अतुल्यकालिक है

  • apply() शून्य कार्य है।

  • commit() यदि नया मान लगातार स्टोरेज के लिए सफलतापूर्वक लिखा गया था, तो सही है।

  • apply() राज्यों को बदलने से पहले पूर्ण गारंटी देता है, आपको एंड्रॉइड घटक जीवनचक्र के बारे में चिंता करने की आवश्यकता नहीं है

यदि आप न लौटे हुए मूल्य का उपयोग commit()करते हैं और आप commit()मुख्य धागे से उपयोग कर रहे हैं , apply()इसके बजाय का उपयोग करेंcommit()


13

डॉक्स के बीच अंतर का एक बहुत अच्छा विवरण देते हैं apply()और commit():

इसके विपरीत commit(), जो अपनी प्राथमिकताओं को लगातार स्टोरेज के लिए सिंक्रोनाइज़ apply()करता है , अपने इन-मेमोरी में SharedPreferencesतुरंत बदलाव करता है , लेकिन डिस्क पर एक एसिंक्रोनस कमिट शुरू कर देता है और आपको किसी भी असफलता की सूचना नहीं दी जाएगी। इस पर एक और संपादक हैं SharedPreferencesएक नियमित रूप से करता है commit(), जबकि एक apply()अभी भी बकाया है, commit()जब तक सभी async प्रतिबद्ध के साथ-साथ खुद को प्रतिबद्ध के रूप में पूरा कर रहे हैं रोकेंगे। जैसा कि SharedPreferencesउदाहरणों एक प्रक्रिया के भीतर एकमात्र हैं, यह के किसी भी मामले को बदलने के लिए सुरक्षित है commit()के साथ apply()अगर आप पहले से वापसी मान अनदेखी कर रहे थे।


6

जावदोक से:

कमिट () के विपरीत, जो अपनी प्राथमिकताओं को लगातार स्टोरेज के लिए सिंक्रोनाइज़ करता है, इन-मेमोरी शेयर्डप्रिफरेंस में इसके बदलाव तुरंत लागू करता है, लेकिन डिस्क पर एसिंक्रोनस कमिट शुरू कर देता है और आपको किसी भी विफलता के बारे में सूचित नहीं किया जाएगा। यदि इस SharedPreferences पर एक अन्य संपादक एक नियमित रूप से प्रतिबद्ध () करता है, जबकि एक> लागू () अभी भी बकाया है, तो प्रतिबद्ध () तब तक अवरुद्ध हो जाएगा जब तक कि सभी async के पूरा होने के साथ ही साथ प्रतिबद्ध न हों


1

कमिट (और लागू) के बीच का अंतर

हम उन दो शब्दों से भ्रमित हो सकते हैं, जब हम SharedPreference का उपयोग कर रहे हैं। मूल रूप से वे शायद एक ही हैं, इसलिए चलो प्रतिबद्ध () और लागू () के अंतर को स्पष्ट करते हैं।

1. रियर मूल्य:

apply()सफलता या विफलता का संकेत देने वाले बूलियन को लौटाए बिना करता है। commit() अगर बचत काम करती है तो सच है, अन्यथा झूठ।

  1. गति:

apply()ज्यादा तेज़ है। commit()धीमा है

  1. एसिंक्रोनस बनाम सिंक्रोनस:

apply(): एसिंक्रोनस commit(): सिंक्रोनस

  1. परमाणु:

apply(): परमाणु commit(): परमाणु

  1. त्रुटि सूचना:

apply(): नहीं commit(): हाँ


apply()"तेज" कैसे है commit()? वे अनिवार्य रूप से एक ही कार्य का प्रतिनिधित्व करते हैं जिसे थ्रेड के लूपर में रखा जाएगा। commit()उस कार्य को मुख्य लूपर में रखता है जबकि apply()इसे पृष्ठभूमि पर ले जाता है, जिससे मुख्य लूपर डिस्क I / O कार्य से मुक्त रहता है।
तासीर

कमिट () के विपरीत, जो अपनी प्राथमिकताओं को लगातार स्टोरेज के लिए सिंक्रोनाइज़ करता है, इन-मेमोरी शेयर्डप्रिफरेंस में इसके बदलाव तुरंत लागू करता है, लेकिन डिस्क पर एसिंक्रोनस कमिट शुरू कर देता है और आपको किसी भी विफलता के बारे में सूचित नहीं किया जाएगा। यदि इस SharedPreferences पर एक अन्य संपादक एक नियमित रूप से प्रतिबद्ध () करता है, जबकि एक आवेदन () अभी भी बकाया है, तो प्रतिबद्ध () तब तक अवरुद्ध हो जाएगा जब तक कि सभी async कमिट पूरे नहीं हो जाते हैं और साथ ही प्रतिबद्ध स्वयं DOC developer.android.com/reference/
चनाका वीरसिंघे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.