2010-08-24 8 views
6

हम सोच रहे थे कि Bundle का उपयोग धारावाहिक या पार्सल करने योग्य वस्तुओं के साथ करते समय, वास्तव में मार्शलिंग वास्तव में कब होता है? जैसे ही आप इसे बंडल में डालते हैं? चूंकि बंडलों का उपयोग आमतौर पर दो स्क्रीनों के बीच डेटा को पास करने के लिए किया जाता है (हम यहां आईपीसी के बारे में भी बात नहीं कर रहे हैं!), किसी वस्तु को मार्शल करने में बहुत अधिक प्रतीत नहीं होता है, क्योंकि यह हर समय स्मृति में रहता है, नहीं ?क्या एक धारावाहिक वस्तु हमेशा बंडल में डालते समय क्रमबद्ध हो जाती है?

हम सही मानते हुए में हैं वास्ते (यह हो जावा serializing या Android बाँटने का कार्य) केवल तब होता है

  1. डेटा किसी अन्य प्रक्रिया है, उदा को भेजे जाने चाहिए कि अगर आरएमआई के दौरान, या
  2. घटक (गतिविधि या सेवा) नष्ट हो जाता है और उदाहरण स्थिति डिस्क पर लिखी जानी चाहिए?

मैंने देखा है एंड्रॉयड ढांचे इंजीनियरों (मेरा मानना ​​है कि यह डायने Hackborn था) का कहना है कि एक Parcelable बजाय Serializable का उपयोग करना चाहिए क्योंकि पूर्व तेज हो गया है। कितना तेज? और क्या इससे कोई फर्क पड़ता है यदि ऑब्जेक्ट को अधिकांश समय तक मार्शल नहीं किया जाता है (मान लीजिए कि इस बारे में हमारी धारणाएं सही थीं)?

उत्तर

6

मुझे लगता है कि मैंने इसे समझ लिया है। मैं मूल रूप से एंड्रॉयड Parcel और Bundle स्रोत कोड के माध्यम से डिबगिंग के बारे में आज का सबसे पूरा अंतिम दिन बिताया और, और यहाँ यह कैसे काम करता है:

  • एक बंडल मूल रूप से एक HashMap चारों ओर सिर्फ एक आवरण है, लेकिन यह करने के लिए समर्थन करता है पार्सल (यानी मार्शल) है कि आंतरिक नक्शा और उसकी सामग्री
  • यदि आप एक बंडल में एक मूल्य के शब्दों में कहें, यह पहली बार इस आंतरिक नक्शा unparcel, और फिर बस मूल्य है कि नक्शे
  • नक्शा unparceling में डाल दिया जाएगा lazily होता है: यह अगर आप इसे एक्सेस करने का प्रयास कर रहे हैं तो केवल इसे अनदेखा कर देगा (उदाहरण के लिए bundle.putParcelable() को कॉल करके)। फिर भी, यह केवल नक्शा को ही अद्वितीय करेगा, लेकिन इसके मूल्य नहीं। केवल तभी जब आप वास्तव में इन मानों तक पहुंचने का प्रयास करते हैं (उदाहरण के लिए bundle.getParcelable ("key") का उपयोग करके) यह मूल्य को भी अनदेखा कर देगा। दूसरे शब्दों में, यदि आप किसी बंडल के अंदर कुछ ऐसा पार्सल करते हैं, तो यदि आप इन मानों को दोबारा एक्सेस नहीं करते हैं तो अनसुलझा नहीं होगा।

तो आम तौर पर: नहीं, एक मूल्य के लिए यह एक बंडल में डाल द्वारा बस parceled नहीं है। इसके बजाए, बंडल को किसी अन्य घटक (गतिविधि या सेवा) में पार करते समय पार्सलिंग होती है; एंड्रॉइड ऐसा क्यों करता है, मुझे नहीं पता, क्योंकि कोई आईपीसी तकनीकी रूप से नहीं हो रहा है।) या जब इसे अन्यथा पार्सल किया जाना चाहिए।

+0

अस्वीकरण: यह हमारे ऐप को डिबग करने से काफी कुछ है, जो इसके लायक है। 'एन' और' एम 'नामक चर से भरा स्रोत कोड पढ़ना सबसे मजेदार चीज नहीं है, इसलिए शायद मुझे कुछ याद आया :-) – Matthias

+0

अस्वीकरण 2: गलतफहमी से बचने के लिए, वे चर बंडल स्रोत कोड का हिस्सा थे, नहीं हमारा अपना: - डी – Matthias

0

मुझे लगता है कि यह तुरंत होता है। और मुझे लगता है कि प्रदर्शन में वृद्धि काम करने के लिए क्रमिक आवश्यक प्रतिबिंब की वजह से है। मुझे लगता है कि यह धारावाहिक और बाह्यकरण के बीच प्रदर्शन अंतर के समान है।

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