Android के लिए स्थानीय छवि कैशिंग समाधान: स्क्वायर पिकासो, यूनिवर्सल इमेज लोडर, ग्लाइड, फ्रेस्को?


89

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

(मेरी सभी छवियां स्थानीय स्तर पर डिस्क पर हैं, इसलिए मुझे नेटवर्किंग की आवश्यकता नहीं है, इसलिए मुझे नहीं लगता कि वॉली एक फिट हैं)

जवाबों:


80

अपडेट सितंबर 2018: कई वर्षों के बाद, मुझे स्थानीय छवि कैशिंग समाधान के लिए लगभग एक ही चीज की आवश्यकता थी। इस बार, UIL सक्रिय विकास में नहीं रहा है। मैंने लोकप्रिय पुस्तकालयों की तुलना की, और निष्कर्ष बहुत अच्छा नहीं है: केवल ग्लाइड का उपयोग करें। यह बहुत अधिक शक्तिशाली और विन्यास योग्य है। सालों पहले मुझे फोर्क करना पड़ा और यूआईएल में बदलाव करना पड़ा। Glide कैशिंग रणनीति और कस्टम कुंजियों के साथ रिज़ॉल्यूशन कैशिंग के कई स्तरों के संदर्भ में मेरे सभी उपयोग मामलों का समर्थन करता है। बस ग्लाइड का उपयोग करें!

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

पिकासो:

  • पिकासो का धाराप्रवाह इंटरफ़ेस अच्छा है। लेकिन "साथ", "में", "लोड" के साथ कूदते हुए आप वास्तव में नहीं जानते कि दृश्य के पीछे क्या है। यह भ्रम है कि क्या लौटा है।

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

  • छवियाँ इसकी कुंजी में आकार के साथ कैश्ड हैं, यह उपयोगी है जब आप विभिन्न आकारों के साथ चित्र प्रदर्शित करते हैं।

  • आप मेमोरी कैश आकार को कस्टमाइज़ कर सकते हैं। लेकिन इसका डिस्क कैश केवल http रिक्वेस्ट के लिए है। स्थानीय छवियों के लिए, यदि आप लोडिंग गति के बारे में परवाह करते हैं, तो थंबनेल डिस्क कैश होना अच्छा है, ताकि आपको हर बार एक छवि के लिए कई एमबी नहीं पढ़ना पड़े। पिकासो के पास डिस्क पर थंबनेल का आकार बदलने और सहेजने के लिए यह तंत्र नहीं है।

  • पिकासो अपने कैशे उदाहरण तक पहुंच को उजागर नहीं करता है। (जब आप पहली बार पिकासो को कॉन्फ़िगर करते हैं और इसे आसपास रखते हैं तो आप इसे पकड़ सकते हैं ...)।

  • कभी-कभी आप श्रोता द्वारा लौटे बिटमैप में छवि को अतुल्यकालिक रूप से पढ़ना चाहते हैं। आश्चर्यजनक रूप से पिकासो के पास ऐसा नहीं है। "लाने ()" खुराक वापस कुछ भी पारित नहीं है। "get ()" सिंक्रोनस रीडिंग के लिए है, और "लोड ()" एसिंक्रोनसली एक दृश्य आकर्षित करने के लिए है।

  • पिकासो के होमपेज पर केवल कुछ सरल उदाहरण हैं, और आपको उन्नत उपयोगों के लिए अनवांटेड जेवाडॉक के माध्यम से पढ़ना होगा।

UIL:

  • यूआईएल बिल्डरों के अनुकूलन के लिए उपयोग करता है। लगभग सब कुछ कॉन्फ़िगर किया जा सकता है।

  • यूआईएल आपको उस आकार को निर्दिष्ट करने की अनुमति नहीं देता है जिसे आप एक दृश्य में लोड करना चाहते हैं। यह दृश्य के आकार के आधार पर कुछ नियमों का उपयोग करता है। यह पिकासो की तरह लचीला नहीं है। स्मृति पदचिह्न को कम करने के लिए मेरे पास कम रिज़ॉल्यूशन छवि को लोड करने का कोई तरीका नहीं है। (संपादित करें: स्रोत कोड में ImageSize तर्क जोड़कर और दृश्य आकार की जाँच को बायपास करके इस व्यवहार को आसानी से संशोधित किया जा सकता है)

  • यूआईएल अनुकूलन डिस्क कैश प्रदान करता है, आप इसका उपयोग निर्दिष्ट आकार के साथ थंबनेल कैश करने के लिए कर सकते हैं। लेकिन यह सही नहीं है। यहाँ विवरण हैं । (संपादित करें: यदि आप गति के बारे में परवाह करते हैं और थंबनेल कैशिंग के कई स्तरों चाहते हैं, तो मेरे मामले की तरह, आप स्रोत कोड को संशोधित कर सकते हैं, डिस्क कैश को "मेमोरीकेय" का उपयोग कर सकते हैं, और इसे आकार के प्रति संवेदनशील भी बना सकते हैं)

  • मेमोरी में विभिन्न आकारों की डिफ़ॉल्ट कैश छवियों द्वारा UIL, और इसे कॉन्फ़िगरेशन में बंद किया जा सकता है।

  • यूआईएल बैकिंग मेमोरी और डिस्क कैश को उजागर करता है जिसे आप एक्सेस कर सकते हैं।

  • यूआईएल लचीले तरीके प्रदान करता है जिससे आप एक दृश्य के लिए एक बिटमैप या लोड प्राप्त कर सकते हैं।

  • दस्तावेज में यूआईएल बेहतर है। यूआईएल जीथब पृष्ठ पर विस्तृत उपयोग देता है, और एक लिंक ट्यूटोरियल है।

मेरा सुझाव है कि पिकासो के साथ शुरू करें, यदि आपको अधिक नियंत्रण और अनुकूलन की आवश्यकता है, तो यूआईएल के लिए जाएं।


मैं वास्तव में उन दोनों के बीच फंस गया हूं ... मैं अनिवार्य रूप से अपने सर्वर से एक निर्देशिका में संग्रहीत छवियों को वापस लाने जा रहा हूं ... इसलिए http कॉल के माध्यम से और फिर इसे कैशिंग (थंबनेल और नियमित आकार) के लिए स्टोर करूंगा, मैं संभवतः स्टोर करूंगा मेरी निर्देशिका पर दोनों आकार) ... तो फिर जाने का रास्ता क्या है?
सिंह 8989

@ Lion789 पिकासो केवल स्थानीय फ़ाइलों के लिए स्थानीय मेमोरी कैश करता है, और यह नेटवर्किंग कैश के लिए HttpResponseCache का उपयोग करता है, आपको उस पर गौर करना होगा। यूआईएल में विन्यास योग्य डिस्क कैश है, आप इसे छवि / थंबनेल के विभिन्न आकार को स्वीकार करने के लिए कुछ छोटे बदलाव कर सकते हैं। हो सकता है कि पिकासो पहले प्रयास करें, यदि आपको यह बहुत सीमित लगता है, तो UIL के लिए जाएं और अनुकूलित करें
XY

तो पिकासो छोटी छवियों को लोड कर सकते हैं! फिर मुझे 8 मेगापिक्सेल लोड करने की ज़रूरत नहीं है! धन्यवाद, आपने मेरी मदद की!
एरन लोरिंज़

क्या आप कृपया इस प्रश्न का उत्तर दे सकते हैं? stackoverflow.com/questions/35433895/…
उस्मान राणा

UIL does not allow you to specify the size you want to load into a view100% सही नहीं है। UIL के साथ आप उपयोग कर सकते हैंpublic void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options, ImageSize targetSize, ImageLoadingListener listener, ImageLoadingProgressListener progressListener)
मार्टिन मैलोस्टेक

72

यदि आप Koush द्वारा G + पर इस पोस्ट को पढ़ते हैं तो आपको अपने भ्रमों के लिए स्पष्ट समाधान मिलेंगे, मैंने उस का सार प्रस्तुत किया है, उस Android में यूनिवर्सल-इमेज-लोडर आपकी आवश्यकता के लिए विजेता है!

  • यदि आप नेटवर्क का उपयोग कर रहे हैं तो पिकासो के पास सबसे अच्छी छवि एपीआई है!

  • UrlImageViewHelper + AndroidAsync सबसे तेज़ है। इन दो महान पुस्तकालयों के साथ खेलने पर वास्तव में प्रकाश डाला गया है कि छवि एपीआई काफी दिनांकित है, हालांकि।

  • वॉली स्लीक है; मैं वास्तव में उनके प्लगेबल बैकएंड ट्रांसपोर्ट का आनंद लेता हूं,
    और एंड्रॉइड्सकॉइन को वहां छोड़ने का अंत कर सकताहूं। अनुरोध प्राथमिकता
    और रद्दीकरण प्रबंधन महान है (यदि आप नेटवर्क का उपयोग कर रहे हैं)

  • एंड्रॉइड-यूनिवर्सल-इमेज-लोडर
    वर्तमानमें सबसे लोकप्रिय है। अत्यधिक अनुकूलन।

इस परियोजना का उद्देश्य अतुल्यकालिक छवि लोडिंग, कैशिंग और प्रदर्शन के लिए पुन: प्रयोज्य उपकरण प्रदान करना है। यह मूल रूप से Fedor Vlasov की परियोजना पर आधारित है और तब से काफी हद तक इसे फिर से बनाया और बेहतर बनाया गया है।

नए यूआईएल संस्करण में आगामी परिवर्तन (1.9.2):

UI थ्रेडवे कैशे एपीआई (अधिक लचीली) में से इमेजलॉडर को कॉल करने की संभावना। जेक व्हार्टन की DiskLruCache पर आधारित नई LruDiscCache।

इस सभी को ध्यान में रखते हुए एंड्रॉइड-यूनिवर्सल-इमेज-लोडर आपकी आवश्यकता को सूट करता है ( लोड हो रहा है कि छवियां स्थानीय रूप से डिस्क पर हैं )!


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

45

मैं इन 3 पुस्तकालयों के साथ अपने अनुभव को साझा करना चाहूंगा: यूआईएल, पिकासो और वॉली। मैंने पहले यूआईएल का उपयोग किया था, लेकिन फिर मैं इस नतीजे पर पहुंचा कि मैं वास्तव में इसकी सिफारिश नहीं कर सकता और मैं इसके बजाय वॉली या पिकासो का उपयोग करने का सुझाव दूंगा, जो दोनों उच्च प्रतिभाशाली टीमों द्वारा विकसित किए गए हैं। यूआईएल बिल्कुल खराब नहीं है, लेकिन इसमें अन्य दो पुस्तकालयों के विस्तार पर ध्यान नहीं दिया गया है।

मैंने पाया कि यूआई यूआई प्रदर्शन के साथ कम अच्छा है; यह वॉली या पिकासो की तुलना में UI थ्रेड को लॉक करने के लिए जाता है। यह इस तथ्य के कारण हो सकता है कि यूआईएल छवि प्रतिक्रियाओं को बैचने का समर्थन नहीं करता है जबकि पिकासो और वॉली डिफ़ॉल्ट रूप से करते हैं।

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

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

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

संपादित करें (18 दिसंबर 2014): जब से मैंने यह प्रारंभिक उत्तर लिखा है तब से चीजें बदल गई हैं और मुझे लगा कि इसे सुधारना आवश्यक है:

पिकासो 2.4 पुरानी रिलीज़ की तुलना में और भी अधिक कॉन्फ़िगर करने योग्य है, और जब ओकेहट्प (जिसकी अत्यधिक अनुशंसा की जाती है) के साथ इसका उपयोग किया जाता है, तो यह प्रत्येक उदाहरण के लिए एक अलग डिस्क कैश का उपयोग करने में भी सक्षम है, इसलिए वास्तव में कोई प्रतिबंध नहीं है कि आप क्या कर सकते हैं। इससे भी महत्वपूर्ण बात, मैंने देखा कि पिकासो और ओकेहटप के प्रदर्शन में बहुत सुधार हुआ है और मेरी राय में यह अब एंड्रॉइड, पीरियड के लिए सबसे तेज़ इमेज लोडर समाधान है। कृपया ध्यान दें कि मेरे कोड में मैं हमेशा मेमोरी के उपयोग के .fit()साथ .centerCrop()या .centerInside()कम मेमोरी उपयोग के संयोजन में उपयोग करता हूं और UI थ्रेड पर बिटमैप के आकार से बचता हूं । पिकासो सक्रिय रूप से विकसित और समर्थित है और यह निश्चित रूप से एक बड़ा प्लस है।

वॉली ने बहुत कुछ नहीं बदला है, लेकिन मैंने इस दौरान इसके साथ दो मुद्दों पर गौर किया:

  • कभी-कभी भारी लोड के तहत, कुछ छवियों को कुछ डिस्क कैश भ्रष्टाचार के कारण लोड नहीं किया जाता है।
  • NetworkImageView (इसके स्केल टाइप से सेंटरक्रॉप पर सेट) में प्रदर्शित थम्बनेल अन्य पुस्तकालयों के साथ जो मिलता है उसकी तुलना में काफी धुंधला है।

इन कारणों से मैंने वॉली का उपयोग बंद करने का फैसला किया।

यूआईएल अभी भी धीमा है (विशेष रूप से डिस्क कैश) और इसके एपीआई में अक्सर बदलने की प्रवृत्ति होती है।

मैंने ग्लाइड 3 नामक इस नई लाइब्रेरी का भी परीक्षण किया जो पिकासो की तरह एपीआई के साथ पिकासो की तुलना में अधिक अनुकूलित होने का दावा करती है। मेरे निजी अनुभव के अनुसार, यह वास्तव में पिकासो और वॉली की तुलना में धीमे लोड के तहत नेटवर्क अनुरोधों के दौरान धीमा है, यहां तक ​​कि जब ओकेहैप के साथ संयोजन में उपयोग किया जाता है। इससे भी बदतर, यह एक गतिविधि छोड़ने पर लॉलीपॉप के तहत मेरे एप्लिकेशन के साथ कुछ क्रैश का कारण बना। अपने प्रतिस्पर्धियों पर इसके 2 लाभ अभी भी हैं:

  • यह एनिमेटेड GIFs डिकोडिंग का समर्थन करता है
  • यह डिस्क कैश में अंतिम डाउनस्कॉल किए गए बिटमैप्स को डालता है, जिसका अर्थ है कि डिस्क कैश से वापस पढ़ना बेहद तेज है।

निष्कर्ष: मैं अब पिकासो + ओक् थ्टप का उपयोग करने की सलाह देता हूं क्योंकि यह सबसे अच्छा लचीलापन, एपीआई, प्रदर्शन और स्थिरता संयुक्त प्रदान करता है। अगर आपको GIF सपोर्ट चाहिए तो आप ग्लाइड पर भी विचार कर सकते हैं।


1
यूआईएल पर अपने अंतिम बिंदु को संबोधित करने के लिए, आप अपनीImageLoader इच्छानुसार कई अलग-अलग कक्षाएं और कॉन्फ़िगरेशन बना सकते हैं । आपको बस ImageLoaderकक्षा को उप- वर्ग करने की आवश्यकता है । यहाँ देखें: github.com/nostra13/Android-Universal-Image-Loader/issues/…
TalkLittle

हैक जैसा दिखता है, लेकिन टिप के लिए धन्यवाद, यह जानना अच्छा है।
ब्लेडकॉडर

3
मैं यह नहीं कह सकता कि मैं भावुकता से सहमत हूं, हम यहां पिकासो का उपयोग करते हैं, मेरे पास 500+ उच्च रिज़ॉल्यूशन की छवियों वाला एक एल्बम है, और मैं प्रदर्शन और स्मृति मुद्दों में चल रहा था, यूआईएल की कोशिश की और चीजों को तुरंत हल किया गया। यह एक न्यूनतम नमूने पर था जो हमारी समस्याओं को अलग कर रहा था जिसे हम देख रहे थे।
HaMMeReD

यदि आप ऐसी छवियां प्रदर्शित कर रहे हैं जिनमें स्क्रीन की तुलना में बहुत अधिक रिज़ॉल्यूशन है या उच्च रिज़ॉल्यूशन छवियों के कई थंबनेल हैं, तो आपको निश्चित रूप से उन्हें नीचे करना चाहिए। मुझे लगता है कि यूआईएल स्वचालित रूप से ऐसा करता है और पिकासो ऐसा नहीं करता है यदि आप उचित विकल्प निर्दिष्ट नहीं करते हैं, इसलिए मेमोरी मुद्दे। मैं व्यक्तिगत रूप से वॉली में NetworkImageView का उपयोग करना पसंद करता हूं, यह एक विजेट है जो लोड की गई छवि को अपने स्वयं के आकार तक डाउन करता है।
ब्लेडरोडर

UIL में, क्लास DisplayImageOptions का उपयोग किया जा सकता है यदि हम किसी विशेष छवि पर कुछ अन्य प्रसंस्करण को बदलना या लागू नहीं करना चाहते हैं।
राहुल रस्तोगी

7

मैंने एक ऐसा ऐप लागू किया है जिसे लगातार प्राप्त करना चाहिए और इंटरनेट से चित्र दिखाना चाहिए। मैं एक छवि कैश तंत्र प्रोग्राम करने वाला था, इससे पहले कि एक दोस्त ने मुझे यूनिवर्सल इमेज लोडर की सिफारिश की।

यूआईएल बहुत अच्छा अनुकूलन योग्य है। यह इतना अनुकूलन योग्य है कि एक नौसिखिया आसानी से कुछ गलत कर सकता है। हालाँकि, मेरे आवेदन में UIL धीमा था और यह थोड़ा धीमा हो गया। मेरा उपयोग मामला छवियों के साथ एक सूची दृश्य था।

कल मैं यूआईएल के विकल्प की तलाश में था, और मैंने पिकासो की खोज की। पिकासो को एकीकृत करना और उपयोग करना आसान था: बस Picasso.context(context).load(url).into(imageview)और छवि तेजी से और आसानी से एकीकृत हो सकती है।

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


भविष्य के पाठकों के लिए: पिकासो से बेहतर ग्लाइड है। एक नज़र है
therealprashant

0

मुझे लगता है कि पिकासो पुस्तकालय की तुलना में इमेजलाडर अधिक अनुकूलन योग्य और लचीला है।


8
कैसे? थोड़ा स्पष्टीकरण मदद करेगा।
डैरन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.