在Android上序列化可绘制对象

在Android上序列化可绘制对象,android,serialization,drawable,Android,Serialization,Drawable,我试图通过缓存图像并在滚动列表时从手机而不是互联网加载来加速我的ListView。但是,当我尝试序列化可绘制对象时,我遇到了一个异常。这是我的职责: private void cacheImage(Drawable dr, Article a){ FileOutputStream fos; try { fos = openFileOutput(a.getArticleId().toString(), Context.MODE_PRIVATE);

我试图通过缓存图像并在滚动列表时从手机而不是互联网加载来加速我的ListView。但是,当我尝试序列化可绘制对象时,我遇到了一个异常。这是我的职责:

    private void cacheImage(Drawable dr, Article a){
    FileOutputStream fos;
    try {
        fos = openFileOutput(a.getArticleId().toString(), Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(dr); 
        oos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();
    }
}
这段漂亮的代码导致:

java.io.NotSerializableException:android.graphics.drawable.BitmapDrawable


序列化这些图像的最佳方法是什么?

如果您的
可绘制文件都是
位图
,您可以使用存储它们,您只需要缓存从internet获取的位图(可绘制文件)。所有其他可抽绳最有可能在您的apk中

如果要将位图写入文件,可以使用
Bitmap
类:

private void cacheImage(BitmapDrawable dr, Article a){
    FileOutputStream fos;
    try {
        fos = openFileOutput(a.getArticleId().toString(), Context.MODE_PRIVATE);
        dr.getBitmap().compress(Bitmap.CompressFormat.PNG, fos);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();
    }
}

请看谷歌Shleves项目,他们实际上在做你想做的事情。请参阅他们维护图像的WeakReference和SoftReference的代码。

这似乎可行,但如何将存储的图像读回我的应用程序?