Estoy totalmente nuevo para la publicación de las preguntas aquí, sin embargo he estado leyendo mucho por aquí durante años. Normalmente yo siempre soy capaz de encontrar mis respuestas a fondo de la búsqueda en la web, pero esta vez estoy en una pérdida…

Después de haber pasado otro día tratando de averiguar por qué esto no funciona me decidí a pedir ayuda, con la esperanza de ustedes me puede dar un par de punteros, o mejor, una solución.

El problema:
En un juego de Android que he llegado al punto donde tengo que hacer la solicitud recuerde su estado cuando un usuario por ejemplo, prensas de la CASA-botón de pantalla. Después de algunas búsquedas, me di cuenta de que para hacer mis clases de inicializar de nuevo a sus estados correspondientes después de volver a abrir la aplicación tuve que soportar la interfaz Parcelable a pasar con el Paquete.

En mi onStop y onStart funciones que respectivamente guardar y restaurar el estado del juego y de un conjunto, sin embargo, cuando me llame el putParcelable y getParcelable funciones en el conjunto del objeto writeToParcel y createFromParcel funciones nunca son llamados.

Temiendo que esto puede haber sido debido a la relativa complejidad del juego, pensé que tenía mejor crear una aplicación muy sencilla para tratar de conseguir que funcione.

Basa en muchos Parcelable ejemplos que he visto en línea, esto 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 de mi actividad Principal que yo llamarí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 ni de las funciones (con la putParcelable y getParcelable funciones) dará lugar a la correspondiente Parcelable llamadas en mi clase de prueba.

Lo más curioso es que, de alguna manera, leer los valores correctos (lo he probado con más variables en la clase), pero a mi la depuración y mi registro muestra que tha aplicación nunca llega a writeToParcel y createFromParcel.

Lo que me estoy perdiendo aquí?

Cualquier ayuda /pensamientos se agradece.

  • Si la respuesta resuelve tu pregunta, ¿te marca eso? O ¿buscar una mejor solución a su problema? Le post que aquí?
InformationsquelleAutor AD-Venture | 2011-01-31

3 Comentarios

  1. 11

    Al parecer, el Android Paquete de la clase no se adhiere a la parcelable protocolo que lugar es seguido durante IPC cálculo de referencias.

    Lugar, parece que el Paquete de la aplicación simplemente, escribe y lee el Parcelable objeto en su propio interior de mapa por medio de la reflexión. A partir de una prueba que hice, parece que el Paquete escribe/lee cada campo definido en su Parcelable clase derivada, sólo porque se hayan declarado esos campos.

    • Esto parece ser cierto, excepto veces cuando la actividad es destruido, cuando el parcelable se llama a los métodos.
    • Mismo aquí. Ni siquiera el marcado de una variable como transitoria será de ayuda. Todavía será serializado. Este es el inesperado comportamiento de la introducción de insectos desagradables. ¿Alguno de ustedes se abrió una marcada acerca de esto?
    • No, no lo hicimos. Mirando hacia atrás, probablemente pensamos que era algo demasiado cerca de a los detalles de la implementación en oposición a la finalidad del Paquete se supone que debe servir. Básicamente estoy de acuerdo con lo que @Luis escribió.
    • es esta documentado en ninguna parte?
    • En ese momento (3+ años atrás) no hemos podido encontrar nada acerca de eso. Hemos aprendido el duro camino. También, en cuanto a la documentación, eche un vistazo a @Luis respuesta
    • es correcto. Si usted necesita para depurar algo en su parcelable métodos, puede hacerlo entrando en las Opciones de Desarrollador y la comprobación de «no mantener actividades»

  2. 4

    Técnicamente, la documentación no dice que writeToParcel o createFromParcel son llamados desde onSaveInstance. Como cuestión de hecho, si usted comprueba la savedState en el código que se va a encontrar que es exactamente la misma instancia del objeto en tanto que la guarde y la restauración de los casos; tiene sentido para evitar serializar-deserializar si se puede.
    OTOH, la documentación no dice que la serialización no se hace. La conclusión debe ser que no debes depender de cualquiera de los dos casos, sólo se supone que conseguir la correcta paquete.

    También, es posible que desee comprobar http://developer.android.com/guide/topics/resources/runtime-changes.html

  3. 0

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

    Esto es realmente malo …. Esto significa que potencialmente almacena una enorme cantidad de datos para nada el uso de esta manera.

Dejar respuesta

Please enter your comment!
Please enter your name here