2013-02-25 12 views
5

私はSVG Androidhttp://code.google.com/p/svg-android/)を使用しています。私は私のアプリのいくつかの活動で同じsvgファイルを使用しています。画像を保存したり取得したりするキャッシュを構築することをお勧めしますか?AndroidでのSVG画像のキャッシュとメモリ使用量

私は、このように(SVGから生成)PictureDrawableを保存するためにSparseArrayを使用しています:

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

私はPictureDrawableオブジェクトを管理する際のメモリ使用量に注意を払う必要がありますか?キャッシュ内の最大アイテムが50未満であることを確認します。

答えて

4

はい、非常に優れたアイデアです。最初の実行時にのみ、アプリケーションはその特定のデバイス画面サイズのイメージをsvgから生成し、キャッシュに保存しますそれ以降は常にこれらを使用してください。多くのCPUを節約し、UIの読み込みを高速化します。

ただし、キャッシュファイルを保存しておき、アプリケーションのバージョンを含む名前を付けることをおすすめします。いくつかの異なるsvgイメージでアップデート(バージョン2など)をリリースすると、古いファイルの代わりに異なる名前の新しいファイルが使用されます。

通常、Context.getCacheDir()で10Mbまで使用できますが、ストレージが不足していると、このフォルダはクリーニングされます。

また、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

ありがとう:

は、ここで私はほとんどちょうどアプリのキャッシュディレクトリから、保存して、直列化オブジェクトを取得するために使用するクラスです。実際に私はキャッシュにファイルを格納していません。私はRAMを使用しています!それはまだ良いアイデアですか? –

+0

@Seraphim RAMにキャッシュを使用していますか?変数を格納するだけです。キャッシュは、アイテムをディスクに格納するときにはるかに便利です。 –

+0

アプリケーションのいくつかの場所で同じPictureDrawableを再利用するといくつかの利点がありますか? –

関連する問題