2013-02-17 10 views
9

लागू किए बिना इरादे के भीतर ऑब्जेक्ट संदर्भ पास करें मुझे पता है कि समान प्रश्न कई बार पूछे गए हैं। मुझे लगता है कि मैं इसे सबसे ज्यादा पढ़ता हूं। लेकिन कोई जवाब लागू नहीं है।सीरियलज़ेबल या पार्ससेल योग्य

मुझे इरादों (गतिविधि कॉल/प्रसारण) के माध्यम से जटिल वस्तुओं को पारित करने की आवश्यकता है। सब कुछ मेरी प्रक्रिया के भीतर किया जाता है। यही कारण है कि मुझे स्ट्रीम में अपनी ऑब्जेक्ट्स लिखने का कोई कारण नहीं दिखता है, ताकि उन्हें कुछ मिलीसेकंड फिर से इकट्ठा किया जा सके। मैं अपने आवेदन के माध्यम से अपना ऑब्जेक्ट संदर्भ पास करना चाहता हूं। क्या इसे करने का कोई तरीका है।

चूंकि मेरा एप्लिकेशन एक ही घटना को कई बार प्रसारित करेगा क्योंकि मैं स्थिर सदस्यों पर भरोसा नहीं कर सकता। मैंने जो प्रसारण किया था उसके लिए मुझे एक ही वस्तु को असाधारण रूप से प्राप्त करने की आवश्यकता है।

यही कारण है कि मैं एक स्थिर "रेफरेंसहोल्डर" के बारे में सोच रहा था जो एक ऑब्जेक्ट स्वीकार करेगा और एक पूर्णांक लौटाएगा जो इस ऑब्जेक्ट को इसकी आंतरिक सूची में पहचानता है ताकि मैं इस पूर्णांक को .putExtras के माध्यम से पास कर सकूं। लेकिन जहां तक ​​मुझे जावा पता है, मैं इस ऑब्जेक्ट को इस सूची से साफ़ नहीं कर पाया क्योंकि इसे जोड़ा गया है क्योंकि एकाधिक श्रोताओं को एक ही ऑब्जेक्ट में समेकित किया जा सकता है और मुझे इसे हमेशा मेरे रेफरहोल्डर में रखना होगा (मान लीजिए कि थ्रेड किसी भी समय फिर से शुरू किया जा सकता है - यहां तक ​​कि 2 मिनट बाद भी)।

कोई विचार? क्या मुझसे कुछ गलत हो रही है? या किसी भी विचार के बारे में कोई विचार है कि मैं अपने रिफ्रेंस को कैसे साफ कर सकता हूं (शायद कुछ सेकंड के बाद? इससे क्रैश हो सकता है लेकिन ऐसा लगता है कि कोड लिखने से अधिक लागू होता है जो किसी भी कारण से मेरे ऑब्जेक्ट को इकट्ठा करता है और फिर से इकट्ठा करता है)

उत्तर

7

आपके विकल्प हैं बहुत स्पष्ट: एक इरादे में एक गैर-marshallable वस्तु (पार्ससेल, serializable) पारित करने का कोई तरीका नहीं है। पूर्ण विराम।

आप जो कुछ करने में सक्षम हो सकते हैं वह है जो किसी गैर-मार्शबल ऑब्जेक्ट का संदर्भ है। विचार यह है कि आप मानचित्र पर एक कुंजी पारित करने के आदेश पर कुछ करेंगे जो उस मूल्य को उस कुंजी को मानचित्रित करता है जिसे आप पास करने में रुचि रखते हैं। यदि दोनों इरादे प्रेषक और इरादे प्राप्तकर्ता के पास मानचित्र तक पहुंच है, तो आप गैर-मार्शबल ऑब्जेक्ट के संदर्भ को संवाद कर सकते हैं।

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

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

बेस्ट ऑफ लक

+0

कुछ लोगों ने वांछित वस्तु को पारित करने के लिए एप्लिकेशन ऑब्जेक्ट में स्थिर क्षेत्र का उपयोग करने के लिए समान प्रश्नों में अनुशंसा की। यही वह है जो मैं नहीं चाहता। एक स्थिर WeakHashMap कुल कानूनी है। यदि हर संदर्भ को मंजूरी दे दी गई है तो मुझे कभी वस्तु की आवश्यकता नहीं होगी, इसलिए वीक रिरेंस बिल्कुल वही है जो मुझे चाहिए। – Chris

+0

@ क्रिस क्षमा करें, मुझे समझ में नहीं आता है कि आप एक स्थिर चर का उपयोग क्यों नहीं कर सकते हैं ** एक ऑब्जेक्ट संदर्भ ** को एक गतिविधि से दूसरे में पास करें। अगर गतिविधि ए 'Globals.object = objectIWantToPass;' और फिर 'ActivityBBonCreate() 'ऑब्जेक्ट myObject = Globals.object है, तो मेमोरी लीक का कोई खतरा नहीं है; Globals.object = शून्य; ' –

+2

क्योंकि यह एक भयानक समाधान है। यही कारण है कि आप संदर्भ के आधार पर वस्तुओं को पारित करते हैं, न कि वर्ग के स्थिर सदस्य द्वारा। मैं एक गतिविधि के रूप में एक गतिविधि के रूप में सोचता हूं जो उस डेटा के साथ कुछ करता है जो मैं पास करता हूं और वह किसी बिंदु पर वापस आ जाएगा और कुछ मामलों में कॉलर को कुछ डेटा वापस दिया जाएगा। लेकिन ऐसा लगता है कि यह एकमात्र तरीका है ... – Chris

4

संपादित करें:

इस समाधान के बारे में भूल। यह काम नहीं करता। एंड्रॉइड उस इरादे से मुकाबला कर रहा है जिसे आप पास करते हैं .startActivity()। किसी गतिविधि के अंदर कोई संदर्भ प्राप्त करने का कोई तरीका नहीं है। यह है - मेरी राय में - Google द्वारा महान bu **** t मेरा। आपको अपनी गतिविधि को कॉल करना होगा और स्थिर वस्तुओं में अपनी ऑब्जेक्ट के रिफरेंस को रखना होगा ...

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

एक बहुत ही उत्कृष्ट aticle यहाँ पाया जाता है: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

मैं इस सवाल के माध्यम से है कि समाधान के लिए मिल गया: Is it possible to get the object reference count?

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

+2

मैं एक एंड्रॉइड विशेषज्ञ नहीं हूं, लेकिन मुझे संदेह है कि 'वीक रेफरेंस' काम करेगा। 'Serializable'/'पार्ससेल योग्य' आवश्यकता * का तात्पर्य है कि एक मौलिक अंतर्निहित आवश्यकता है कि वस्तु एक स्थान से दूसरे स्थान पर गहरी प्रतिलिपि बनाई गई है। इसका तात्पर्य है कि संदर्भ पास करने का कोई भी रूप काम नहीं करेगा; जैसे क्योंकि हम विभिन्न स्मृति पता रिक्त स्थान के बारे में बात कर रहे हैं। और यहां तक ​​कि यदि यह काम करता है, तो तर्क यह होना चाहिए कि किसी ऐप के उदाहरणों के बीच साझाकरण संदर्भ अन्य कारणों से खराब है। –

+0

आप सही हैं। मैंने इसका परीक्षण किया। एक गतिविधि जो प्राप्त करता है वह वही नहीं है जैसा मैंने बनाया था। – Chris

+0

क्या मैं स्थानीय ब्रॉडकास्ट मैनेजर का उपयोग करके भेजे गए एक इरादे में ऑब्जेक्ट रेफरेंस पास कर सकता हूं यदि मेरे पास पार्ससेल योग्य रैपिंग है? – JohnyTex

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