2010-07-05 15 views
5

मैंने आलसी लोडिंग के बारे में कुछ पोस्ट की समीक्षा की है लेकिन मेरा मानना ​​है कि मेरी समस्या थोड़ा अलग है।एंड्रॉइड: गैलरी में आलसी लोडिंग

मेरे पास एक गैलरी है (मेरी कक्षा गैलरी फैली हुई है) जो 20 आकारों में बड़ी छवियों (400-500K प्रत्येक) प्रदर्शित करती है। मैं उन्हें गैलरी में लोड नहीं कर सकता क्योंकि मुझे आउटऑफमेमरी अपवाद मिलता है।
तो, मैंने 20 ड्रॉबल्स की एक सरणी बनाई और शुरुआत में पहले 9 तत्वों (छवियों को वेब से आते हैं) को पॉप्युलेट किया और बाकी सभी को शून्य पर सेट कर दिया। मेरा इरादा यह था: दाईं ओर झुकाव पर, तत्व संख्या प्राप्त करें। 10 और शून्य तत्व संख्या में सेट करें। 0. सही लाने के लिए एक और झुकाव तत्व संख्या संख्या। 11 और शून्य तत्व संख्या में सेट करें। 1 शून्य करने के लिए। एक झुकाव बाईं ओर एक ही तर्क।

समस्या यह है कि मैं तत्वों की तुलना में बहुत तेजी से फ़्लिंग कर सकता हूं। मेरे गैलरी एक BaseAdapter है और इसके getView() इस तरह दिखता है:

 
public View getView(int position, View convertView, ViewGroup parent){ 
    ImageView imageView = new ImageView(); 
    imageView.setDrawable(imageArray[position]; 
    .... 
    .... 

    return imageView; 
} 

मैं getView (कैसे बताऊँ) - अगर imageArray [स्थिति] अभी भी रिक्त है, एक "लोड हो रहा है ..." संवाद और दिखाने एक बार यह सेट हो जाने के बाद खुद को एक ही स्थिति के साथ दोहराएं?
मैं छवि को खाली नहीं देखना चाहता हूं और फिर फ्लाई पर सेट करना चाहता हूं। मैं छवि दृश्य को तब तक देखने में सक्षम नहीं होना चाहता जब तक कि यह सेट न हो जाए।

धन्यवाद।

+1

एंड्रॉइड ब्लॉग (साथ ही कुछ उदाहरण कोड) पर एक शानदार पोस्ट है जो आपके प्रश्न का उत्तर देता है: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – Ally

उत्तर

6

गैलरी को चिकनी अनुभव के लिए डिज़ाइन किया गया है। यदि आप स्क्रीन को अवरुद्ध करते हैं तो यह बहुत खराब यूआई होगा और जब तक इसे प्राप्त नहीं किया जाता है तब तक अगली छवि पर स्विच न करें। इस तरह उपयोगकर्ता बिल्कुल फिसलने में सक्षम नहीं होगा। लोड होने के दौरान आपको छवि के बजाय कुछ लोडिंग सूचक दिखाना चाहिए।

मुझे लगता है कि आपका परिदृश्य सामान्य है। आपको छवियों को डाउनलोड करना चाहिए और उन्हें प्रदर्शित करना चाहिए। अगर आपको आउटऑफमेमरी मिलती है तो आप छवियों को सुपरसंपल करने का प्रयास कर सकते हैं Strange out of memory issue while loading an image to a Bitmap object

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

आप मेरे नमूना कोड Lazy load of images in ListView पर एक नज़र डाल सकते हैं। वास्तव में यह एक सूची दृश्य एडाप्टर है लेकिन आप इसे मामूली संशोधन के साथ गैलरी में लागू कर सकते हैं। मुझे लगता है कि यह वही करेगा जो आपको चाहिए।

+0

धन्यवाद फेडरर । कोशिश करेंगे ... – Rob

+0

"लोड होने के दौरान आपको छवि के बजाय कुछ लोडिंग सूचक दिखाना चाहिए।" मैं इसे कैसे प्राप्त करूं? मुझे पता है कि गैलरी के सामने प्रोग्रेसडिअलॉग में लोडिंग इंडिकेटर कैसे रखा जाए, लेकिन मैं छवि के बजाय सूचक को कैसे डालूं? बस आपको याद दिलाने के लिए, imageView रनटाइम पर बनाया गया है। अगर इसे एक्सएमएल में परिभाषित किया गया था तो मैं इसे एक डिफ़ॉल्ट स्रोत सौंपा सकता था लेकिन यह मामला यहां नहीं है ... धन्यवाद। – Rob

+1

यह कोई समस्या नहीं है। आप ImageView के बजाय रनटाइम पर प्रोग्रेस कंट्रोल बना सकते हैं। या आप रनटाइम पर ImageView बना सकते हैं और वास्तविक छवि डाउनलोड होने पर कुछ स्टब छवि प्रदर्शित कर सकते हैं। मैं अपने नमूना कोड में स्टब छवि प्रदर्शित करता हूं। – Fedor

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