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

在Android上缓存SVG图像和内存使用,android,image,memory-management,svg,Android,Image,Memory Management,Svg,我正在使用SVG Android。我在应用程序的几个活动中使用相同的svg文件。构建缓存来存储和检索图像是一个好主意吗 我使用SparseArray以以下方式存储Picturedravable(从SVG生成): SVG svg = SVGParser.getSVGFromResource(resources, resourceId); PictureDrawable pictureDrawable = svg.createPictureDrawable(); cache.put(resource

我正在使用SVG Android。我在应用程序的几个活动中使用相同的svg文件。构建缓存来存储和检索图像是一个好主意吗

我使用SparseArray以以下方式存储Picturedravable(从SVG生成):

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

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

是的,这是一个非常好的主意,只有在第一次运行时,应用程序才会从svg生成特定设备屏幕大小的图像,并将其存储在缓存中,然后一直使用这些图像。节省大量CPU,更快的UI加载

但是,我建议使用包含应用程序版本的名称保存缓存文件。如果您使用一些不同的svg图像发布更新(比如版本2),那么将使用具有不同名称的新文件而不是旧文件

Context.getCacheDir()
中最多可以使用10Mb,系统将在存储空间不足时清理此文件夹

另外,作为一种很好的方法,每次初始化
缓存
类时,都可以进行一些清理,即删除一些旧版本或不需要项目

下面是一个类,我主要用于从应用缓存目录保存和获取可序列化对象:

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

}
公共类ObjectCacheFile{
私有最终文件mFile;
公共ObjectCacheFile(上下文、字符串名称){
mFile=新文件(context.getCacheDir(),名称);
}
公共文件getFile(){
返回mFile;
}
公众作废认沽权(T o){
试一试{
如果(!mFile.exists()){
mFile.createNewFile();
}
FileOutputStream fos=新的FileOutputStream(mFile);
ObjectOutputStream objOut=新的ObjectOutputStream(fos);
试一试{
对象写入对象(o);
}最后{
objOut.close();
}
}捕获(IOE异常){
Log.e(App.getLogTag(this),“保存缓存文件时出错”,e);
}
}
@抑制警告(“未选中”)
公共部门得不到{
如果(!mFile.exists()){
返回null;
}
试一试{
ObjectInputStream objIn=新ObjectInputStream(新文件输入流(mFile));
试一试{
返回(T)objIn.readObject();
}最后{
objIn.close();
}
}捕获(IOE异常){
Log.e(App.getLogTag(this),“读取缓存文件时出错”,e);
}捕获(ClassNotFoundException e1){
Log.e(App.getLogTag(this),“缓存文件损坏,正在删除”,e1);
mFile.delete();
}
返回null;
}
}

谢谢。实际上,我并没有在文件中存储缓存。我在用RAM!这仍然是个好主意吗?@Seraphim在RAM中使用缓存?您可以只存储一个变量。当您将项目存储在磁盘上时,缓存会更有用。在我的应用程序中的多个位置重复使用相同的PictureDrawable是否有一些好处?@Seraphim是的,由于没有重复的对象,因此消耗的RAM更少。是的,但对象不会像往常一样“垃圾收集”。通常,如果我在活动中声明变量,那么当活动被销毁时,引用将被清除。如果我在SparseArray中保留一个引用,我会得到应用程序使用的更多内存。这是真的吗?