2013-02-25 21 views
5

Używam SVG Android (http://code.google.com/p/svg-android/). Używam tego samego pliku svg w kilku działaniach mojej aplikacji. Czy dobrze jest zbudować pamięć podręczną do przechowywania i pobierania obrazów?Buforowanie obrazów SVG na Androidzie i użycie pamięci

Używam SparseArray przechowywać PictureDrawable (wygenerowany z SVG) w ten sposób:

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

Czy muszę zwrócić uwagę na zużycie pamięci podczas zarządzania obiektów PictureDrawable? Potwierdzam, że maksymalna liczba pozycji w pamięci podręcznej będzie mniejsza niż 50.

Odpowiedz

4

Tak, jest to bardzo dobry pomysł, tylko przy pierwszym uruchomieniu aplikacja wygeneruje obrazy dla danego rozmiaru ekranu urządzenia z svg i zapisze je w pamięci podręcznej i używaj ich cały czas po tym. Oszczędza dużo procesora, szybsze ładowanie interfejsu użytkownika.

Zalecam jednak zapisywanie plików pamięci podręcznej o nazwach zawierających wersję aplikacji. Jeśli wydasz aktualizację (np. Wersję 2) z różnymi obrazami svg, zamiast starych plików będą używane nowe pliki o różnych nazwach.

Zwykle OK, aby użyć do 10 MB w Context.getCacheDir(), system wyczyści ten folder, gdy będzie mało pamięci.

Poza tym za każdym razem, gdy inicjalizujesz klasę Cache, możesz trochę wyczyścić, tzn. Usunąć starą wersję lub nie wymaga elementów.

Oto klasa Najczęściej po prostu zapisać i uzyskać Serializable obiektu z App katalogu pamięci podręcznej:

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

Dzięki. Właściwie nie przechowuję pamięci podręcznej w pliku. Używam pamięci RAM! Czy to nadal dobry pomysł? –

+0

@Seraphim Korzystanie z pamięci podręcznej w pamięci RAM? możesz po prostu zapisać zmienną. Pamięć podręczna jest o wiele bardziej przydatna podczas przechowywania elementów na dysku. –

+0

czy są zalety ponownego użycia tego samego PictureDrawable w kilku miejscach w mojej aplikacji? –

Powiązane problemy