在Android上缓存SVG图像和内存使用情况

Ser*_*m's 7 svg android memory-management image

我正在使用SVG Android(http://code.google.com/p/svg-android/).我在我的应用程序的几个活动中使用相同的svg文件.构建缓存以存储和检索图像是一个好主意吗?

我正在使用SparseArray以这种方式存储PictureDrawable(从SVG生成):

SVG svg = SVGParser.getSVGFromResource(resources, resourceId);
PictureDrawable pictureDrawable = svg.createPictureDrawable();
cache.put(resourceId, pictureDrawable);
Run Code Online (Sandbox Code Playgroud)

管理PictureDrawable对象时是否必须注意内存使用情况?我确认缓存中的最大项目将小于50.

S.D*_*.D. 5

是的,这是一个非常好的想法,只有在首次运行时,App才会从svg为特定设备屏幕大小生成图像,并将它们存储在缓存中,并在此之后一直使用这些图像.节省了大量CPU,加快了UI加载速度.

但是,我建议使用包含App版本的名称保存缓存文件.如果您使用某些不同的svg映像发布更新(比如版本2),则将使用具有不同名称的新文件而不是旧文件.

它通常可以使用高达10Mb Context.getCacheDir(),系统会在存储空间不足时清理此文件夹.

另外,作为一个很好的衡量标准,每次初始化Cache类时,都可以做一些清理,即删除一些旧版本或不需要项目.

这是一个我主要用来保存并从App缓存目录中获取Serializable对象的类:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)