6

I'm trying to speed up my ListView by cacheing the images and loading them from the phone rather than the internet when scrolling the list. However, I run into an exception when I try to serialize the Drawable object. This is my function:

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

This nifty bit of code results in:

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

What is the best approach to serialize these images?

karl
  • 173
  • 3
  • 8

3 Answers3

6

You should only need to cache bitmap (drawables) that you i.e. fetched from the internet. All other drawables are most likely in your apk.

If you want to write a Bitmap to file you can use the Bitmap class:

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();
    }
}
thaussma
  • 9,756
  • 5
  • 44
  • 46
  • This seems to work, but how would I go about reading the stored images back into my application? – karl Jul 14 '11 at 13:21
0

In case your Drawables are all Bitmaps you can store them using Bitmap.compress()

mibollma
  • 14,959
  • 6
  • 52
  • 69
-2

Please see http://code.google.com/p/shelves/ Google Shleves project they are actually doing what you want. please see code they are maintaining WeakReference and SoftReference to Images.

AZ_
  • 21,688
  • 25
  • 143
  • 191