2012-01-20 13 views
12

अब तक मैं एंड्रॉइड में छवियों के लिए SoftReference कैश का उपयोग कर रहा हूं। इस कैश का उपयोग उन छवियों के लिए किया जाता है जो ListViews में दिखाए जाते हैं और यदि स्मृति में पर्याप्त स्मृति शेष है, तो स्क्रीन पर दिखाए गए स्मृति में आइटम्स की छवियों को रखने में मदद करनी चाहिए।एंड्रॉइड में मेमोरी छवि कैश में कैसे कार्यान्वित करें?

इस समस्या में यह है कि सॉफ़्ट रेफरेंस कचरे को लगभग उसी पल में इकट्ठा किया जाता है जब अंतिम हार्ड संदर्भ जारी किया जाता है। इसका नतीजा यह है कि स्क्रीन से हटाई गई एक छवि उस पल में कचरा एकत्र की जाती है और यदि उपयोगकर्ता सूची दृश्य में इस प्रविष्टि पर वापस स्क्रॉल करता है तो छवि को आंतरिक फोन मेमोरी से पुनः लोड किया जाता है जिसके परिणामस्वरूप जटिल आलसी लोडिंग प्रक्रिया होती है, जिसके परिणामस्वरूप सूची और सामान्य खराब प्रदर्शन के लगातार redraws में।

नरम संदर्भ व्यवहार के लिए bug request बताता है कि यह एकमात्र व्यवहार है और आपको इस तरह की सामग्री को कैश करने के लिए LRU-Cache का उपयोग करना चाहिए।

मेरे प्रश्न के बारे में जानें। एलआरयू कैश केवल उतनी मेमोरी लेगा जितना मैं उसे अनुमति देता हूं। लेकिन अगर ऐप को बहुत मेमोरी चाहिए तो यह स्मृति मुक्त नहीं होगा। मुझे कैश का उपयोग करने की अनुमति कैसे देनी चाहिए, और कैश के आकार को कम करने का कोई तरीका है यदि फोन की मेमोरी स्थिति तंग हो जाती है?

फिलहाल छवि कैश को सभी गतिविधियों के लिए वैश्विक छवि भंडारण के रूप में एप्लिकेशन के अंदर सहेजा जाता है। इसके परिणामस्वरूप मेरा ऐप लगातार छवि कैश की सभी मेमोरी का उपयोग करेगा, भले ही मेरी गतिविधियां पृष्ठभूमि में हों या नष्ट हो जाएं।

उत्तर

3

पृष्ठभूमि प्रक्रियाओं को जीवित रखना एक ओएस-स्तरीय अनुकूलन है जो आपकी प्रक्रिया को तेज़ी से वापस स्विच कर देता है। आपकी प्रक्रिया केवल तब तक जीवित रहेगी जब तक ओएस स्मृति को बर्दाश्त कर सके; जब किसी अन्य एप्लिकेशन के लिए उस स्मृति की आवश्यकता होती है तो आपकी प्रक्रिया मारे जायेगी और इसके संसाधन जारी किए जाएंगे।

यदि आप अपनी प्रक्रिया को पृष्ठभूमि में हर बार अपना कैश मुक्त करते हैं, तो आपके आवेदन पर वापस स्विच करना अब तेज़ नहीं होगा क्योंकि यह कैश-मिस देखेगा। यह एंड्रॉइड की रख-पृष्ठभूमि-प्रक्रियाओं को जीवंत बनाता है-जीवंत अनुकूलन!

आपको केवल LruCache का उपयोग करना चाहिए, जो Android Support Package में एंड्रॉइड 3.0 (हनीकॉम) से पहले रिलीज़ के लिए भी शामिल है।

+0

उत्तर – Janusz

+0

के उत्तर के लिए धन्यवाद, मैं नहीं देख सकता कि LruCache का उपयोग करने से कैशिंग छवियों या किसी अन्य बीएलओबी की समस्या को ठीक किया जाएगा। समस्या इसका निश्चित आकार है, जिसमें से प्रत्येक प्रविष्टि कैश्ड ऑब्जेक्ट का एक मजबूत संदर्भ रखती है। यह डिवाइस की स्मृति के साथ स्केल नहीं करेगा। – Matthias

+0

LruCache प्रविष्टियों को सूचित करता है जब इसका आकार आपके द्वारा निर्धारित सीमा से अधिक हो जाता है। आप LruCache प्रत्येक प्रविष्टि के आकार को मापने में मदद करने के लिए एक विधि को ओवरराइड कर सकते हैं। –

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