Android के लिए सामान्य छवि

इस लेख में मैं एक उपकरण के बारे में बात करूँगा जिसे मैंने विकसित किया (और न केवल) अतुल्यकालिक रूप से छवियों को लोड करने, कैशिंग करने और उन्हें प्रदर्शित करने के लिए। विकास के इस चरण में, इसका उपयोग हर जगह किया जा सकता है जहां आपको इंटरनेट से या फाइल सिस्टम से ImageView पर एक चित्र अपलोड करने की आवश्यकता होती है। सभी की जरूरत है छवि का URL है (फ़ाइल सिस्टम के लिए यह "फ़ाइल: //" से शुरू होगा) और खुद ImageView , जिसमें डाउनलोड की गई छवि डालनी होगी। ImageLoader के सार्वभौमिक की क्षमताओं के बारे में अधिक पढ़ें नीचे एक रीड विकसित किया गया है। यह सब एक परियोजना में शुरू हुआ, जिसमें मुझे भाग लेने का अवसर मिला: एक सूची में समाचार देखने के लिए इसे लागू करना आवश्यक था। और फिर निश्चित रूप से सूची मदों में चित्रों को प्रदर्शित करने के बारे में सवाल खड़ा हुआ। चित्र इंटरनेट से डाउनलोड किए गए थे, इसलिए उनके एसिंक्रोनस लोडिंग, डिस्प्ले और कैशिंग को लागू करना आवश्यक था। नेट पर एक त्वरित खोज ने मुझे इस समस्या के अगले लगभग तैयार समाधान के लिए प्रेरित किया। लागू किए गए LazyImageLoader ने इंटरनेट से चित्रों को असिंक्रोनस रूप से डाउनलोड किया, उन्हें फ़ाइल सिस्टम में कैश्ड किया, और उन्हें मेमोरी में संग्रहीत भी किया। मेमोरी में स्टोर करने की विधि बिना किसी कमजोर लिंक के एक साधारण हाशप थी, जिसके परिणामस्वरूप आउटऑफमेरीऑयोर को सूची को स्क्रॉल करने के एक निश्चित चरण में बाहर निकलना शुरू हुआ (और कई सूची भी थीं)। HashMap को WeakValueHashMap के साथ बदल दिया गया था, और फिर एक मेमोरी ऑप्शन के साथ मैप के अपने कार्यान्वयन के साथ। धीरे-धीरे, इस LazyImageLoader के आधार पर, हमारे अपने ImageLoader अपने स्वयं के चिप्स और ट्रिक्स के साथ बढ़ने लगे। इसका उपयोग न केवल सूचियों में, बल्कि गैलरी में और सरल "वन-टाइम" डिस्प्ले के लिए चित्रों को प्रदर्शित करने के लिए किया जा सकता है। इस इमेजलॉडर को बाद में दो अन्य परियोजनाओं में पुन: उपयोग किया गया, जिसने इसकी व्यवहार्यता की पुष्टि की। मौजूदा कोड को महत्वपूर्ण रूप से परिष्कृत करने और स्वीकार्य सुंदरता में रखने के बाद, मैंने गीथहब के लिए स्रोत कोड अपलोड किया है , जहां अब टूल को और अधिक अनुकूलित किया जा रहा है, लचीलापन और अनुकूलन बढ़ा रहा है। तो, यह ImageLoader क्या कर सकता है? प्रदर्शन छवियां स्पष्ट है। कैशिंग के बारे में क्या? कैशिंग में विभाजित है:मेमोरी कैश है हाशपैप <स्ट्रींग, बिटमैप> मूल्यों में कमजोर लिंक के साथ। कैसे "कमजोर" (नरम, कमजोर, प्रेत) आपके लिए तय करना है:
public abstract class Cache<K, V> { protected final Map<K, Reference<V>> softMap = new HashMap<K, Reference<V>>(); public V get(K key) { if (softMap.containsKey(key)) { Reference<V> reference = softMap.get(key); return reference.get(); } else { return null; } } public void put(K key, V value) { softMap.put(key, createReference(value)); } public void clear() { softMap.clear(); } protected abstract Reference<V> createReference(V value); } 
वर्तमान संस्करण बिटमैप कैश का उपयोग करता है जो इसके आकार को नियंत्रित करता है। यह एक अतिरिक्त "हार्ड" सूची को लागू करके लागू किया गया था, जहां सॉफ्टमैप से बिटमैप्स के "मजबूत" लिंक संग्रहीत किए गए थे । जैसे ही कैश आकार स्वीकार्य सीमा से अधिक हो जाता है, "सबसे पुरानी" वस्तुओं को "हार्ड लिस्ट" से हटा दिया जाता है, जिससे एक मजबूत लिंक खो जाता है। कमजोर लिंक अभी भी सॉफ्टमैप में संग्रहीत है, लेकिन वहां बिटमैप पहले से ही पूरी तरह से कचरा कलेक्टर की दया पर है। जब फ़ाइल सिस्टम पर कैशिंग किया जाता है, तो फ़ाइलों को इमेजयूआरएल.शशकोड () के रूप में संदर्भित किया जाता है और बाद में उसी सिद्धांत पर कैश को खोजने के लिए उपयोग किया जाता है। पूरी तरह कार्यात्मक पर विचार करें। ImageLoader की विधि है:
 void displayImage(String imageUrl, ImageView imageView, DisplayImageOptions options, ImageLoadingListener listener) 
पैरामीटर इमेज यूआरएएल और इमेज व्यू , मुझे लगता है, सवाल नहीं उठाएंगे। DisplayImageOptions क्लास को एक चित्र लोड करने, कैशिंग और प्रदर्शित करने की प्रक्रिया को कॉन्फ़िगर करने के लिए डिज़ाइन किया गया है। इसका उपयोग आप निर्दिष्ट कर सकते हैं:ImageLadingListener इंटरफ़ेस आपको छवि लोड करने की प्रक्रिया को "सुनने" की अनुमति देता है:
 public interface ImageLoadingListener { void onLoadingStarted(); void onLoadingComplete(); } 
लेकिन अगर वर्तमान तस्वीर मेमोरी में कैश में है, तो श्रोता घटनाओं को नहीं फेंकेंगे। UI स्ट्रीम पर ईवेंट्स को फेंक दिया जाता है, जिससे आप यूआई को श्रोता में एक शांत आत्मा के साथ स्पर्श कर सकते हैं। इसलिए, ImageLoader का उपयोग करने का एक उदाहरण :
 ImageLoader imageLoader = ImageLoader.getInstance(context); DisplayImageOptions options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.stub_image) .cacheInMemory() .cacheOnDisc() .build(); imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() { @Override public void onLoadingStarted() { spinner.show(); } @Override public void onLoadingComplete() { spinner.hide(); } }); 
मैं ImageLoader के काम के तंत्र के बारे में ज्यादा नहीं फैला। मैं केवल कुछ बातें कहूंगा:एक बार फिर, मैं GitHub पर सूत्रों का लिंक दूंगा । मुझे उम्मीद है कि यह ImageLoader आपके लिए उपयोगी है।

UPD (12.19.2011): उपकरण में कुछ महत्वपूर्ण बदलाव किए गए थे, उनके बारे में विवरण और समग्र रूप से परियोजना को यहां पढ़ा जा सकता है
UPD (02/23/2012): बहुत सारे बदलाव और सुधार किए गए (जिसमें मल्टीथ्रेडिंग, बाहरी कॉन्फ़िगरेशन भी शामिल है)। लेकिन मुख्य एपीआई मूल रूप से एक ही है। अब टूल जार के रूप में उपलब्ध है। संस्करण पेश किया।
UPD (03/11/2012): मैंने पुस्तकालय का उपयोग करने के लिए एक विस्तृत गाइड लिखा:


Source: https://habr.com/ru/post/In134186/


All Articles