La mejor forma de volver a crear marcadores / polilíneas cuando se gira el teléfono (cambio de orientación)

Fondo:

  • El desarrollo de una aplicación Android nativa que utiliza Android Google Map v2, utiliza android.support.v4.app.FragmentActivity . Se ejecuta en Android v2.2.

Objetivo:

  • Conservar marcadores / polilíneas "dibujadas" en el mapa antes de cambiar la orientación del teléfono.

Pregunta (s):

  1. ¿Puedo "guardar" los marcadores / polilíneas como parte del paquete y simplemente volver a mostrarlos guardándolos en el onSaveInstanceState utilizando los métodos savedInstance.put.. y luego "restaurarlos" en onCreate usando el savedInstanceState.get.. adecuado Métodos

    Al revisar la descripción de Marker getID() , estoy confundido cuando la documentación de Google para el método Marker.getId() establece lo siguiente:

    Cuando se restaura un mapa desde un paquete, también se restauran los marcadores que estaban en ese mapa . Sin embargo, estos marcadores serán representados por diferentes objetos Marcador. El identificador de un marcador se puede utilizar para recuperar la nueva instancia de un objeto Marcador después de dicha restauración.

    La documentación de Google (texto en negrita anterior) hace que parezca que los marcadores se restauran automágicamente sin tener que realizar ninguna acción. Esa no es mi experiencia … Tal vez estoy malinterpretando lo que se dice. O tal vez usted tiene que guardar explícitamente mapa en el Bundle? ¿Puede alguien aclarar lo que esto significa?

  2. Suponiendo que tendré que guardar explícitamente el marcador y las polilíneas en el paquete a través del método savedInstance.put... el marcador completo o debería guardar el identificador del marcador y recuperar el marcador de información con el identificador del marcador para volver a mostrar ¿el marcador? No pude encontrar un método de put que me permitiera guardar el marcador completo.

    Me di cuenta de que la sección MapFragment de la API de Google Maps para Android v2 afirma lo siguiente:

    Cualquier objeto obtenido de GoogleMap está asociado con la vista. Es importante no aferrarse a los objetos (por ejemplo, Marcador) más allá de la vida de la vista. De lo contrario, causará una pérdida de memoria ya que la vista no se puede liberar.

    Esta afirmación me lleva a creer que no debería intentar guardar el marcador en sí, sino que intento guardar el identificador de marcador y volver a generar el marcador basado en el objeto marcador asociado con el identificador de marcador. Del mismo modo para los PolyLines. ¿Es correcta mi asunción?

  3. Además, ¿debo evitar que el Marcador sea una variable de clase? Mi preocupación es que si el marcador es una variable de clase y el fragmento de mapa de actividad se coloca en la pila de respaldo que esto podría causar una pérdida de memoria, ya que efectivamente será "retener el objeto" como se indica en la documentación antes mencionada. ¿Es esto algo que debería preocuparme?

Saludos.

¿Puedo "guardar" los marcadores / polilíneas como parte del paquete y simplemente volver a mostrarlos guardándolos en el onSaveInstanceState usando los métodos "savedInstance.put .." adecuados y luego "restaurarlos" en onCreate usando el " SavedInstanceState.get .. "métodos.

No.

La documentación de Google (texto en negrita) hace que parezca que los marcadores se restauran automágicamente sin tener que realizar ninguna acción. Esa no es mi experiencia … Tal vez estoy malinterpretando lo que se dice. O tal vez usted tiene que guardar explícitamente mapa en el Bundle? ¿Puede alguien aclarar lo que esto significa?

Usted no está mal interpretando nada. La documentación es incorrecta.

Debo guardar el ID de marcador y recuperar la información del marcador utilizando el ID del marcador para volver a mostrar el marcador

La identificación del marcador no es algo permanente en los cambios de configuración: depende de la secuencia de creación de objetos visuales (la primera llamada a addMarker devuelve el objeto con el ID "m1", el segundo "m2"). No se puede utilizar este valor de ninguna manera (a partir de la versión API 3.1.36) y IMHO realmente no hay punto en su existencia. En realidad, he aceptado un problema relacionado con la identificación . Debe haber al menos una función de GoogleMap.getMarkerById(String) para Marker.getId() para hacer poco sentido.

3) Además, ¿debería evitar tener la variable Marker as a Class? Mi preocupación es que si el marcador es una variable de clase y el fragmento de mapa de actividad se coloca en la pila de respaldo que esto podría causar una pérdida de memoria, ya que efectivamente será "retener el objeto" como se indica en la documentación antes mencionada. ¿Es esto algo que debería preocuparme?

Sí. Mantener una referencia estática al Marker oa cualquier otro objeto visual conduce a una fuga.


No es que contestar todas sus preguntas e inquietudes lo acercara a la solución, así que aquí están mis proposiciones.

Supongo que usted tiene un conjunto de datos que los Markers y Polylines se crean y probablemente almacenar en DB después de ser obtenido de webservice. Ahora, si lo carga desde DB en AsyncTask en su Activity o si no lo almacena en DB , pero sólo busque Activity directamente, eso es malo.

Trate de que sus datos sean lo más accesibles posible, por lo que sólo tiene que volver a cargarse en la memoria después de que el proceso se haya eliminado (o después de dejarlo caer cuando haya poca memoria). Si lo haces, eso es bueno. Por supuesto no todo: si tienes 20000 marcadores y cada uno tiene su imagen mostrada en la ventana de información, puede esperar …

Ahora que tiene todos los datos necesarios para crear marcadores en la memoria, sólo cree como lo haría la primera vez. No se requiere ningún código adicional.

Podemos discutir sobre esto ser buena o mala idea y mejoraré la respuesta, pero esto requiere más información sobre el contexto:

  • Cuántos marcadores y polilíneas
  • Qué datos adicionales tiene
  • Donde mantienes tu modelo
  • Etc.

Hay otra forma de curso: puede enviar MarkerOptions en onSaveInstanceState . Esto podría funcionar para usted si lo mantiene actualizado o si sus Markers no cambian y si no hay tantos de ellos. No puedo dar sentido a enviar miles de objetos a través de IPC en cada rotación o presionando el botón HOME.

Me parece que llamar a setRetainInstance(true); En el fragmento que contiene el mapa se conserva todo en el mapa a través de pausas, cambios de orientación, etc, sin tener que preocuparse por establecer y obtener. ¿Hay alguna razón por la que este no es el enfoque recomendado?

  • Problema con la eliminación de la polilínea google map v2 android
  • Personalizada coloreada como marcador de mapa en Google Maps API v2 - Android
  • Restauración del estado de MapView en rotación y en la parte posterior
  • Android - Dragging marcador sin tener que mantener en el mapa api v2
  • Animación suave de una ruta de cámara en una vista de mapa
  • La ventana de información no es la posición central Android Google Map v2
  • Google Maps API V2 - InfoWindow se pierda el marcador
  • Centro de aplicaciones de Google Maps V2 Ubicación actual en pantalla
  • Android Maps API v2: Polyline se dibuja bajo la superposición de mosaico
  • Búsqueda de Android PlacePicker
  • Android GoogleMap o SupportMapFragment - excepción de puntero nulo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.