Сериализация рисованного объекта на Android - PullRequest
6 голосов
/ 14 июля 2011

Я пытаюсь ускорить мой ListView, кэшируя изображения и загружая их с телефона, а не из Интернета при прокрутке списка. Тем не менее, я сталкиваюсь с исключением при попытке сериализации объекта Drawable. Это моя функция:

    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

Каков наилучший подход для сериализации этих изображений?

Ответы [ 3 ]

6 голосов
/ 14 июля 2011

Вам нужно всего лишь кэшировать растровое изображение (drawables), которое вы извлекли из интернета.Все остальные Drawables, скорее всего, в вашем 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();
    }
}
0 голосов
/ 14 июля 2011

Пожалуйста, смотрите http://code.google.com/p/shelves/ Проект Google Shleves, они на самом деле делают то, что вы хотите. посмотрите код, который они поддерживают WeakReference и SoftReference к изображениям.

0 голосов
/ 14 июля 2011

Если все ваши Drawables равны Bitmaps, вы можете сохранить их, используя Bitmap.compress ()

...