2015-09-04 10 views
19

परिदृश्य: - छवि लोड हो रहा है और कैशिंग पुस्तकालयग्लाइड: छवि को पहले से कैश किया गया है और कैश किए गए संस्करण का उपयोग कैसे करें?

मैं एक बड़ी GIF चित्र जो मैं कैश करने के लिए पहली बार उपयोगकर्ता एप्लिकेशन Glide का उपयोग कर खोलता चाहते हैं। उसके बाद जब भी ऐप ऐप खोलता है, तो मैं मौजूद कैश संस्करण दिखाना चाहता हूं। यह जीआईएफ यूआरएल किसी दिए गए अंतराल के बाद समाप्त हो जाएगा। जब यह समाप्त हो जाता है, तो मैं भविष्य में उपयोग के लिए नया जीआईएफ यूआरएल और प्रदर्शन/कैश लाता हूं।

मैं क्या करने की कोशिश की:

मैं ग्लाइड के GitHub पृष्ठ पर Caching and Cache Invalidation माध्यम से चला गया। मैं Google समूह थ्रेड Ensuring That Images Loaded Only Come From Disk Cache हालांकि चला गया, जो दिखाता है कि छवि प्रपत्र कैश कैसे प्राप्त करें। मैं How to invalidate Glide cache for some specific images प्रश्न के माध्यम से भी चला गया।

उपरोक्त लिंक से मैं निम्नलिखित कोड स्निपलेट देखता हूं जो दिखाता है कि कैश से छवि को कैसे लोड किया जाए। हालांकि यह केवल कैश से छवि प्राप्त करने का प्रयास करता है। कैश में अपनी उपस्थित नहीं है, यह नेटवर्क से प्राप्त करने की कोशिश करता है और विफल रहता है:

Glide.with(TheActivity.this) 
     .using(new StreamModelLoader<String>() { 
      @Override 
      public DataFetcher<InputStream> getResourceFetcher(final String model, int i, int i1) { 
       return new DataFetcher<InputStream>() { 
        @Override 
        public InputStream loadData(Priority priority) throws Exception { 
         throw new IOException(); 
        } 

        @Override 
        public void cleanup() { 
        } 

        @Override 
        public String getId() { 
         return model; 
        } 

        @Override 
        public void cancel() { 
        } 
       }; 
      } 
     }) 
     .load("http://sampleurl.com/sample.gif") 
     .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
     .into(theImageView); 

सवाल:

  1. वहाँ निम्नलिखित प्राप्त करने के लिए एक क्लीनर तरीका है: दिखाएँ कैश से जीआईएफ छवि अगर वर्तमान में जीआईएफ डाउनलोड करें, इसे बाद में उपयोग के लिए कैश करें और इसे ImageView में दिखाएं।

  2. कैशिंग उपरोक्त लेख का उल्लेख है निम्नलिखित:

    अभ्यास में, संचय फ़ाइल रद्द करने के लिए सबसे अच्छा तरीका है अपने पहचानकर्ता बदलने के लिए है जब सामग्री में परिवर्तन (यूआरएल, uri, फ़ाइल पथ आदि)

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

  3. एक ऐसी ही टिप्पणी पर, वहाँ विशिष्ट कुंजी के साथ एक छवि का कूड़ा संग्रह को रोकने के लिए एक तरह से (बड़ी फाइल फिर से डाउनलोड करने से रोकने के लिए) और फिर बाद में जब URL परिवर्तन कैश से पुरानी छवि हटाने का निर्देश है?

उत्तर

24
  1. आप कैश करता है, तो वर्तमान से GIF दिखाने के लिए और यह अन्यथा लाने के लिए एक कस्टम ModelLoader जरूरत नहीं है, जो वास्तव में ग्लाइड का डिफ़ॉल्ट व्यवहार है। बस एक मानक भार लाइन का उपयोग ठीक से काम करना चाहिए:

    Glide.with(TheActivity.this) 
        .load("http://sampleurl.com/sample.gif") 
        .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
        .into(theImageView); 
    

आपका कोड GIF डाउनलोड करने से ग्लाइड कर पाएगा और केवल GIF दिखाएगा कि वह पहले से कैश किया गया है, जो इसे आप की तरह लगता है नहीं चाहिए ।

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

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

+0

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

+0

मुझे लगता है कि आप सही थे। अब सुनिश्चित करें कि यह पहले क्यों नहीं हो रहा था। धन्यवाद फिर से –

+1

खुशी हुई कि यह काम करता है, यदि आपको ऐसा व्यवहार दिखाई देता है जहां आपको उस कस्टम मॉडल लोडर को जीआईएफ ऑफ़लाइन लोड करने के लिए प्राप्त करने की आवश्यकता है, तो कृपया गिटहब पर एक समस्या खोलें (https://github.com/bumptech/glide/issues/ नया) ताकि हम इसमें देख सकें, यह निश्चित रूप से आवश्यक नहीं होना चाहिए। –

1
Glide.with(context) 
.load("http://sampleurl.com/sample.gif") 
.skipMemoryCache(true) 
.into(imageView); 

आप पहले से ही देखा है कि हम .skipMemoryCache (सही) कहा जाता है विशेष रूप से कैश मेमोरी को छोड़ने के लिए ग्लाइड बताने के लिए। इसका मतलब है कि ग्लाइड छवि को स्मृति कैश में नहीं रखेगा। यह समझना महत्वपूर्ण है कि यह केवल स्मृति कैश को प्रभावित करता है! ग्लाइड अभी भी एक ही छवि यूआरएल के अगले अनुरोध के लिए किसी अन्य नेटवर्क अनुरोध से बचने के लिए डिस्क कैश का उपयोग करेगा। इस Glide Cache & request optimization को और पढ़ें।

हैप्पी कोडिंग !!

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