Лучший способ сериализации / десериализации изображения в Android - PullRequest
2 голосов
/ 10 февраля 2012

Я пытаюсь сохранить изображения в Android. В конце концов я остановился на создании объекта-оболочки для обработки сериализации. Я ожидаю, что это неоптимально.

Мой вопрос: как это можно сделать лучше (особенно в отношении производительности и отсутствия ухудшения качества изображения из-за множественных сериализаций)?

public class SerializableImage implements Serializable {

private static final long serialVersionUID = 1L;

private static final int NO_IMAGE = -1;

private Bitmap image;

public Bitmap getImage() {
    return image;
}

public void setImage(Bitmap image) {
    this.image = image;
}

private void writeObject(ObjectOutputStream out) throws IOException {
    if (image != null) {
        final ByteArrayOutputStream stream = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.PNG, 100, stream);
        final byte[] imageByteArray = stream.toByteArray();
        out.writeInt(imageByteArray.length);
        out.write(imageByteArray);
    } else {
        out.writeInt(NO_IMAGE);
    }
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{

    final int length = in.readInt();

    if (length != NO_IMAGE) {
        final byte[] imageByteArray = new byte[length];
        in.readFully(imageByteArray);
        image = BitmapFactory.decodeByteArray(imageByteArray, 0, length);
    }
}
}

1 Ответ

1 голос
/ 10 февраля 2012

Поскольку PNG - это формат без потерь, качество не должно ухудшаться. Вам следует следить не столько за тем, как вы записываете / считываете изображение в файл / из файла, сколько за тем, как часто вы это делаете. Я обнаружил, что создание кэша в памяти с использованием слабых ссылок значительно сокращает количество вызовов ввода-вывода. Также имейте в виду, что даже если вы разрешите системному мусору собирать старые образы, они будут кешироваться дольше в собственном коде. Единственный вызов, который поможет вам справиться с этим, - это вызов Bitmap.recycle

...