#java #android #serializable #android-bitmap
#java #Android #сериализуемый #android-растровое изображение
Вопрос:
Я пытаюсь сохранить состояние списка объектов. И одно из полей в классе object является растровым изображением. И поскольку Bitmap не является сериализуемым, я реализовал свой собственный класс bitmap, который реализует Serializable. Я рассмотрел другие вопросы, чтобы создать этот класс, и, похоже, он должен работать. Но когда я запускаю приложение, оно выходит из строя сразу после выполнения метода writeObject в моем классе serializableBitmap. Но когда он выходит из строя, это не говорит о том, что он, к сожалению, перестал работать, а просто возвращается на главный экран. Он также не выводит никаких сообщений об ошибках в LogCat. Поэтому я понятия не имею, что вызывает сбой. Вот мой класс serializableBitmap:
public class serializableBitmap implements Serializable {
private static final long serialVersionUID = -5228835919664263905L;
private Bitmap bitmap;
public serializableBitmap(Bitmap b) {
bitmap = b;
}
// Converts the Bitmap into a byte array for serialization
private void writeObject(ObjectOutputStream out) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteStream);
byte bitmapBytes[] = byteStream.toByteArray();
if (success)
out.write(bitmapBytes, 0, bitmapBytes.length);
}
// Deserializes a byte array representing the Bitmap and decodes it
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
int b;
while((b = in.read()) != -1)
byteStream.write(b);
byte bitmapBytes[] = byteStream.toByteArray();
bitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length);
}
public Bitmap getBitmap() {
return this.bitmap;
}
}
Любая помощь была бы очень признательна.
О, и в моем классе объектов, который содержит растровое изображение, я реализую Parcelable, а затем в методе writeToParcel, который я вызываю
dest.writeList(bitmaps);
А растровые изображения — это
private ArrayList<serializableBitmap> bitmaps;
Комментарии:
1. В методе сжатия у вас установлено нулевое качество. Это не может быть хорошо.
2. Вы можете сохранить переменную состояния, а затем перезагрузить растровое изображение, соответствующее этому числу.
Ответ №1:
У меня была такая же проблема для больших растровых изображений. Растровые изображения меньшего размера (около 500 x 300 пикселей) работали просто отлично.
Старайтесь избегать сериализации больших растровых изображений и вместо этого загружайте их там, где они необходимы. Вы могли бы, например, сериализовать их URL-адреса и загрузить их позже или записать их в локальное хранилище.