7

私はSVG Android ( http://code.google.com/p/svg-android/ ) を使用しています。アプリのいくつかのアクティビティで同じ svg ファイルを使用しています。画像を保存および取得するためにキャッシュを構築することは良い考えですか?

SparseArrayを使用して、(SVG から生成された) PictureDrawableを次のように格納しています。

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

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

4

1 に答える 1

5

はい、非常に良いアイデアです。最初の実行時にのみ、アプリはその特定のデバイス画面サイズの画像を svg から生成し、キャッシュに保存し、その後は常にこれらを使用します。多くの CPU を節約し、UI の読み込みを高速化します。

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

通常、 で最大 10Mb を使用しても問題ありません。ストレージが不足するとContext.getCacheDir()、システムはこのフォルダを消去します。

また、適切な手段として、クラスを初期化するたびに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;
    }

}
于 2013-02-25T13:20:38.270 に答える