2013-02-25 73 views
5

मैं एसवीजी एंड्रॉइड (http://code.google.com/p/svg-android/) का उपयोग कर रहा हूं। मैं अपने ऐप की कई गतिविधियों में एक ही svg फ़ाइल का उपयोग कर रहा हूं। छवियों को स्टोर और पुनर्प्राप्त करने के लिए कैश बनाने का अच्छा विचार है?एंड्रॉइड पर कैशिंग एसवीजी छवियों और मेमोरी उपयोग

मैं PictureDrawable इस तरह से (SVG से उत्पन्न) स्टोर करने के लिए एक SparseArray उपयोग कर रहा हूँ:

SVG svg = SVGParser.getSVGFromResource(resources, resourceId); 
PictureDrawable pictureDrawable = svg.createPictureDrawable(); 
cache.put(resourceId, pictureDrawable); 

जब PictureDrawable वस्तुओं के प्रबंध मैं स्मृति के उपयोग पर ध्यान देना है? मैं पुष्टि करता हूं कि कैश में अधिकतम आइटम 50 से कम होंगे।

उत्तर

4

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

हालांकि, मैं आपके ऐप के संस्करण वाले नामों के साथ कैश फ़ाइलों को सहेजने की अनुशंसा करता हूं। यदि आप कुछ अलग svg छवियों के साथ एक अद्यतन (संस्करण 2 कहें) जारी करते हैं, तो पुरानी फाइलों के बजाय अलग-अलग नामों वाली नई फाइलों का उपयोग किया जाएगा।

यह आमतौर पर Context.getCacheDir() में 10 एमबी तक उपयोग करने के लिए ठीक है, सिस्टम भंडारण पर कम होने पर इस फ़ोल्डर को साफ़ कर देगा।

इसके अलावा, एक अच्छा उपाय के रूप में, हर बार जब आप Cache कक्षा शुरू करते हैं, तो आप थोड़ा साफ कर सकते हैं, यानी कुछ पुराने संस्करण को हटाएं या वस्तुओं की आवश्यकता नहीं है।

public class ObjectCacheFile<T> { 
    private final File mFile; 

    public ObjectCacheFile(Context context, String name) { 
     mFile = new File(context.getCacheDir(), name); 
    } 

    public File getFile() { 
     return mFile; 
    } 

    public void put(T o) { 

     try { 

      if (!mFile.exists()) { 
       mFile.createNewFile(); 
      } 

      FileOutputStream fos = new FileOutputStream(mFile); 

      ObjectOutputStream objOut = new ObjectOutputStream(fos); 

      try { 
       objOut.writeObject(o); 
      } finally { 
       objOut.close(); 
      } 
     } catch (IOException e) { 
      Log.e(App.getLogTag(this), "error saving cache file", e); 
     } 
    } 

    @SuppressWarnings("unchecked") 
    public T get() { 

     if (!mFile.exists()) { 
      return null; 
     } 

     try { 
      ObjectInputStream objIn = new ObjectInputStream(new FileInputStream(mFile)); 
      try { 
       return (T) objIn.readObject(); 
      } finally { 
       objIn.close(); 
      } 
     } catch (IOException e) { 
      Log.e(App.getLogTag(this), "error reading cache file", e); 
     } catch (ClassNotFoundException e1) { 
      Log.e(App.getLogTag(this), "cache file corrupted, deleting", e1); 
      mFile.delete(); 
     } 

     return null; 
    } 

} 
+0

धन्यवाद:

यहां कक्षा मैं ज्यादातर बस बचाने के लिए और एक Serializable वस्तु मिलता है, एप्लिकेशन संचय निर्देशिका से करने के लिए उपयोग करते हैं। दरअसल मैं फाइल में कैश संग्रहित नहीं कर रहा हूं। मैं रैम का उपयोग कर रहा हूँ! क्या यह अभी भी एक अच्छा विचार है? –

+0

@ सेराफिम रैम में कैश का उपयोग कर? आप बस एक चर स्टोर कर सकते हैं। डिस्क पर आइटम संग्रहीत करते समय एक कैश अधिक उपयोगी होता है। –

+0

क्या मेरे आवेदन में कई जगहों पर एक ही पिक्चर ड्राउबल का पुन: उपयोग करने के कुछ फायदे हैं? –