7

मैं एक (एंड्रॉइड) बिटमैप-कैश के हिस्से के रूप में WeakReference एस का उपयोग करना चाहता हूं ताकि यह जांचने में सक्षम हो कि बिटमैप का अब और उपयोग नहीं किया जाता है।जब WeakReference # मिलता है() शून्य वापस लौटना शुरू करते हैं?

मेरे कैश में अधिकतम आकार है जो जावा हीप-स्पेस से छोटा है। जब एक नया बिटमैप कैश को बहता है, तो उसे बिटमैप्स को छोड़ देना चाहिए जिनकी अब आवश्यकता नहीं है।

मेरा प्रश्न: WeakReference की वापसी() - विधि कब वापस आती है?

  1. जैसे ही वस्तु के लिए कोई और मजबूत संदर्भ नहीं हैं? (और जीसी अभी तक नहीं हुआ है)
  2. या जब जीसी ने भाग लिया और निर्धारित किया कि वे ऑब्जेक्ट के लिए अधिक मजबूत संदर्भ नहीं हैं?

यदि 2. यह सच है कि मैं इस स्थिति में भाग सकता हूं कि मेरा कैश भर सकता है और जीसी हाल ही में किसी कारण से नहीं चला है।

फिर भी अगर मैं पहले से ही संदर्भों को छोड़ देता हूं तो अंतिम जीसी रन के बाद, WeakReference#get() अभी भी ऑब्जेक्ट वापस कर देगा और मेरा कैश इसे साफ़ नहीं करेगा।

उत्तर

10

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

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

कुछ खोज के बाद, मुझे लगता है कि परिवर्तन 3.0 में किया गया था, 2.3 नहीं। फिर भी, समाधान वही है।

+0

सॉफ्ट संदर्भ कैशिंग के लिए हैं। एंड्रॉइड पर उनका व्यवहार क्या है? –

+2

वही- जैसे ही कोई मजबूत संदर्भ मौजूद नहीं है, वे स्वतंत्र हो जाते हैं। जो जावा मानक के पत्र का पालन करता है, अगर आत्मा नहीं है। –

+0

परिवर्तन एपीआई स्तर 9 में था। प्रासंगिक दस्तावेज: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html#memory-cache – Delyan

5

जैसे ही जीसी ने यह निर्धारित किया है कि ऑब्जेक्ट कमजोर पहुंच योग्य है, वैसे ही वीक रेफरेंस को साफ़ कर दिया गया है।

यह आपके दूसरे मामले के करीब है। हालांकि, कमजोर पहुंच के लिए मजबूत संदर्भों की अनुपस्थिति की आवश्यकता नहीं है, बल्कि नरम संदर्भों की अनुपस्थिति भी आवश्यक है।

जावा पैकेज प्रलेखन से java.lang.ref के लिए:

शीतल और कमजोर संदर्भ स्वचालित रूप से यदि कोई हो, कतारों जिसके साथ वे पंजीकृत हैं में जोड़ा जा रहा से पहले कलेक्टर द्वारा मंजूरी दी जाती है। यदि यह न तो जोरदार है और न ही धीरे से पहुंचा जा सकता है, लेकिन एक कमजोर संदर्भ traversing द्वारा पहुंचा जा सकता

...

एक वस्तु दुर्बलता से पहुंचा जा सकता है। जब एक कमजोर पहुंचने योग्य वस्तु के कमजोर संदर्भ को मंजूरी दे दी जाती है, तो वस्तु अंतिम रूप देने के लिए योग्य हो जाती है।

+1

यह जावा स्टैंडपॉइंट से सही है, लेकिन एंड्रॉइड के लिए पूरी कहानी नहीं है। एंड्रॉइड इन विशेषताओं को कैसे लागू करता है और अतीत में यह कैसे बदलता है, इस बारे में मेरी पोस्ट देखें। –

4

बिटमैप्स को कैश करने के लिए कमजोर होने के बजाय सॉफ़्ट रेफरेंस का उपयोग करें। जीसी वीक रेफरेंस को जल्द ही साफ़ कर देगा जैसे ही यह अपने सभी मजबूत और सॉफ्ट संदर्भों को खो देता है जो कैशिंग के उद्देश्य को नष्ट कर सकते हैं। सॉफ़्ट रेफरेंस केवल तभी साफ़ किया जाता है जब कम स्मृति हो। और यह गारंटी है कि जीओ को ओओएमई फेंकने से पहले चलाया जाएगा।

+0

+1 - मुझे यह उल्लेख करने का विचार करना चाहिए था कि, एक बार पुस्तकालय में नरम के साथ कमजोर संदर्भों को प्रतिस्थापित करने के बाद। –

-3

जैसा कि अन्य उत्तरों में बताया गया है, एक बिंदु पर ऑब्जेक्ट के पास एक और मजबूत/मुलायम संदर्भ और जीसी ने स्मृति को पुनः प्राप्त करने के बाद एक कमजोर वापसी वापस कर दी होगी।

अधिक सामान्य नियम पर, मुझे नहीं लगता कि वीक/सॉफ्ट संदर्भ एक आवेदन में एक अच्छी बात है। यह अपने मिश्रण चिंताओं बनाता है:

  • आपका आवेदन व्यापार तर्क
  • JVM के बारे में है और Dalvik स्मृति प्रबंधन और कोड अनुकूलन के बारे में कर रहे हैं।

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

आप इसके बजाय एक निश्चित आकार (तत्वों या बिटमैप आकार की संख्या) एलआरयू कैश रखना चाहते हैं।

आशा है कि मदद करता है!

+2

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

+2

'आपका आवेदन व्यवसाय तर्क के बारे में है' थोड़ा सा अनुमान है। मोबाइल एप्लिकेशन हमेशा रन-ऑफ-द-मिल वेब-सर्विस रैपर नहीं होते हैं, और कमजोर संदर्भ वाष्पशील कैशिंग में एक महत्वपूर्ण अवधारणा है जो मोबाइल और सर्वर दोनों तरफ प्रदर्शन-महत्वपूर्ण अनुप्रयोगों में कई उपयोग पाता है। –

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