java studio - Android:Parcelable.writeToParcel y Parcelable.Creator.createFromParcel nunca se llaman




describecontents parcelabler (4)

Al parecer, la clase de Android Bundle no se adhiere al protocolo que se puede parcelar y que, en cambio, se sigue durante la clasificación de IPC.

En su lugar, parece que la implementación del paquete simplemente escribe y lee el objeto Parcelable en su propio mapa interno por medio de la reflexión. De una prueba que hicimos, parece que el paquete escribe / lee cada campo definido en su clase derivada de Parcelable, solo porque usted ha declarado esos campos.

Soy totalmente nuevo en publicar preguntas aquí, sin embargo, he estado leyendo mucho aquí durante años. Normalmente siempre puedo encontrar mis respuestas buscando en la web, pero esta vez estoy perdido ...

Después de haber pasado un día más tratando de averiguar por qué esto no funciona, decidí pedir ayuda, esperando que me puedan dar algunos consejos, o mejor, una solución.

El problema: en un juego para Android he llegado al punto en el que tengo que hacer que la aplicación recuerde su estado cuando un usuario, por ejemplo, presiona el botón de la pantalla de INICIO. Después de algunas búsquedas, me di cuenta de que para que mis clases se reiniciaran a sus estados apropiados después de volver a abrir la aplicación, tenía que admitir la interfaz de Parcelable para pasarlas con el paquete.

En mis funciones onStop y onStart, respectivamente, guardo y restauro el estado del juego desde y hacia un Bundle, sin embargo, cuando llamo a las funciones putParcelable y getParcelable en el Bundle, nunca se llama a las funciones writeToParcel y createFromParcel del objeto.

Ante el temor de que esto pudiera deberse a la relativa complejidad del juego, pensé que sería mejor crear una aplicación muy simple para intentar que funcionara.

Basado en muchos ejemplos de Parcelable que he visto en línea, esta se convirtió en mi clase:

public class ParcelableTest implements Parcelable {
  int id;

  public ParcelableTest(int newID)
  {
    id = newID;
  }

  private ParcelableTest(Parcel in) {
      readFromParcel(in);
  }

  public void writeToParcel(Parcel out, int arg1) {
      writeToParcel(out);
  }

  public void writeToParcel(Parcel out) {
    Log.v("ParcelableTest","Writing to parcel");
      out.writeInt(id);
  }

  public void readFromParcel(Parcel in) {
      id = in.readInt();
  }

  public int describeContents() {
      return 0;
  }

  public static final Parcelable.Creator<ParcelableTest> CREATOR = new
  Parcelable.Creator<ParcelableTest>() {
      public ParcelableTest createFromParcel(Parcel in) {
          Log.v("ParcelableTest","Creating from parcel");
              return new ParcelableTest(in);
      }

      public ParcelableTest[] newArray(int size) {
              return new ParcelableTest[size];
      }
  };
}

Y desde mi actividad principal llamaría a las siguientes funciones para guardar / restaurar los datos:

public Bundle saveToBundle(Bundle savedState)
    {
      savedState.putParcelable("Test1",mTest1);
      savedState.putParcelable("Test2",mTest2);
      return savedState;
    }
    public void restoreFromBundle(Bundle savedState)
    {
      mTest1 = savedState.getParcelable("Test1");
      mTest2 = savedState.getParcelable("Test2");

    }

Pero por alguna razón, ninguna de las funciones (con las funciones putParcelable y getParcelable) dará como resultado las llamadas parcelables apropiadas en mi clase de prueba.

Lo más extraño es que de alguna manera lee los valores correctos (he intentado con más variables en la clase), pero mi depuración y mi registro muestran que la aplicación nunca llega a writeToParcel y createFromParcel.

¿Que me estoy perdiendo aqui?

Cualquier ayuda / pensamiento sería apreciado.


Confirmo lo que dijo superjos. En el evento saveToBundle, el paquete de Android solo almacena los miembros de la clase por reflexión y no llama a las funciones Parcelable. ¡He perdido un día en este problema! triste....

Esto es realmente malo ... Esto significa que potencialmente almacena una gran cantidad de datos para nada usando esta manera.


Técnicamente, la documentación no dice que writeToParcel o createFromParcel se llaman desde onSaveInstance . De hecho, si verifica el estado savedState en su código, encontrará que es exactamente la misma instancia de objeto en los casos de guardar y restaurar; tiene sentido evitar la serialización-deserialización si puedes.
OTOH, la documentación tampoco dice que la serialización no se realiza. La conclusión debe ser que no debe depender de ninguno de los dos casos, solo suponga que obtiene el paquete correcto.

Además, es posible que desee consultar http://developer.android.com/guide/topics/resources/runtime-changes.html


Esto es lo que noté que nadie lo mencionó en absoluto.

Asignar todos los procesadores disponibles al emulador.

Esto es lo que puedes probar. Acelera el emulador para mí, especialmente durante el tiempo de carga. Noté que el emulador solo está usando un solo núcleo de la CPU disponible. Lo puse para utilizar todos los procesadores disponibles.

Estoy usando Windows 7.

Cuando se inicie el emulador de Android, abra el Administrador de tareas, busque en la pestaña Procesar, busque "emulator-arm.exe" o "emulator-arm.exe * 32" ... Haga clic derecho en él, seleccione Procesador de afinidad y Asigna tanto procesador como quieras al emulador.





java android bundle parcelable