studio - read jsonarray android
Problema serializable de Android (5)
Creé una clase, que tiene varias variables miembro, todas las cuales son serializables ... ¡excepto un mapa de bits! Traté de ampliar el mapa de bits e implementar serializable, sin pensar que Bitmap es una clase final.
Quiero guardar la clase (básicamente forma el estado actual de un juego) para que un jugador pueda recoger y cargar el juego.
De la forma en que lo veo, tengo dos opciones: 1) Encontrar otra forma de guardar el estado del juego. Cualquier ayuda aquí sería apreciada.
2) cambie la variable de miembro de mapa de bits por una int, por ejemplo, y cree una clase BitmapGetter que tenga un método estático que devuelva mapas de bits en función de las entradas. (Esta opción no es fácil, ya que mi clase contiene muchas posibilidades de mapa de bits y la forma en que creé el juego significa que esto requerirá una increíble cantidad de esfuerzo.
Básicamente, no tengo a nadie a quien culpar sino a mí mismo por crear perezosamente una variable de mapa de bits sin pensar, pero agradecería cualquier ayuda ...
¿Qué hay de reemplazar Bitmap con una clase como esta:
public class SerialBitmap implements Serializable {
public Bitmap bitmap;
// TODO: Finish this constructor
SerialBitmap(<some params>) {
// Take your existing call to BitmapFactory and put it here
bitmap = BitmapFactory.decodeSomething(<some params>);
}
// Converts the Bitmap into a byte array for serialization
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteStream);
byte bitmapBytes[] = byteStream.toByteArray();
out.write(bitmapBytes, 0, bitmapBytes.length);
}
// Deserializes a byte array representing the Bitmap and decodes it
private void readObject(java.io.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);
}
}
Los métodos reemplazados Serializable.writeObject () y readObject () serializan los bytes en lugar del mapa de bits para que la clase sea serializable. Tendrás que terminar el constructor porque no sé cómo construyes actualmente tu mapa de bits. Lo último que debe hacer es reemplazar las referencias a YourClass.bitmap con YourClass.serialBitmap.bitmap.
¡Buena suerte!
Barry PS Este código compila pero no lo he probado con un mapa de bits real
En primer lugar, debe serializar a través de Parcelable . Es una clase de Android y generalmente funciona de maravilla, listo para usar: y puedes serializar una ByteArray con ella, con los métodos:
public final void writeByteArray (byte[] b)
y
public final void readByteArray (byte[] val)
Es posible que también desee verificar la documentación de Parcela .
Puede hacer la serialización a mano utilizando los siguientes métodos de Java:
private void writeObject(java.io.ObjectOutputStream out)
private void readObject(java.io.ObjectInputStream in)
Serialice el mapa de bits utilizando getPixels y, cuando realice la deserialización, puede usar createBitmap para volver a crearlo desde cero.
Puede leer sobre cómo usar readObject y writeObject aquí: http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html
Si está bien guardar los datos del mapa de bits por separado en su aplicación, puede hacer lo siguiente:
En su clase que guarda el estado actual, guarde el mapa de bits en la carpeta que elija:
FileOutputStream out = new FileOutputStream(<path to bmp>);
bitmap.compress(CompressFormat.PNG, 100, out);
En la clase que tiene el mapa de bits como miembro, tenga la ruta como el miembro serializable y reconstruya el mapa de bits después de la deserialización:
public class MyClass implements Serializable
{
// ...
private String bitmapPath;
transient Bitmap bitmap;
// ...
private void writeObject(ObjectOutputStream out) throws IOException
{
out.defaultWriteObject();
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
in.defaultReadObject();
bitmap = BitmapFactory.decodeFile(path);
}
Puede implementar cualquier otra funcionalidad de compilación en la función readObject()
si es necesario, ya que el objeto está completamente construido después de la llamada a defaultReadObject()
.
Espero que esto ayude.
Por cierto, http://developer.android.com/reference/android/os/Parcel.html no recomienda usar Parcelable
para fines de serialización. Todavía no tengo suficientes puntos para dejar un comentario, por lo que estoy editando mi propia respuesta para poner esta observación.
Yo tuve el mismo problema.
Y decidí así.
Bitmap
es Parcelable
, así que hice seguimiento a mi clase.
Hice Constructor que obtiene el objeto
Bundle
y getter que devuelve Bundle que representa datos de Objetos. Entonces, mientras Bitmap es parcelable , Bundle puede guardar bitmap como parcelable en él.Cuando necesite pasar la Fecha en intención, puede llamar a los objetos del método
getBundle()
y pasarlos conIntent.putExtra(String key,Bundle value)
En la actividad objetivo, llamará a
getBundle(String key)
y lo pasará al constructor .Creo que es un enfoque muy fácil.