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:
- Cambiar el tamaño de un mapa en tiempo de ejecución
- Cómo abrir la navegación en lugar de mapview en android?
- Dibuja una forma personalizada en android utilizando XML
- Cómo obtener latitud y longitud de la dirección en android
- FindFragmentById (R.id.map) devuelve null en Android L
- Conservar marcadores / polilíneas "dibujadas" en el mapa antes de cambiar la orientación del teléfono.
Pregunta (s):
-
¿Puedo "guardar" los marcadores / polilíneas como parte del paquete y simplemente volver a mostrarlos guardándolos en el
onSaveInstanceState
utilizando los métodossavedInstance.put..
y luego "restaurarlos" enonCreate
usando elsavedInstanceState.get..
adecuado MétodosAl revisar la descripción de Marker
getID()
, estoy confundido cuando la documentación de Google para el métodoMarker.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?
-
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 deput
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?
-
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.
- MapFragment obtiene una superposición oscura cuando se utiliza en DialogActivity
- ¿Cómo mover los derechos de autor a la parte superior de los mapas v2 para android?
- Error al inflar el fragmento de clase
- Google map android API V2 se estrelló
- Los servicios de Google Play están desactualizados. Requiere 3025100 pero encontrado 2012110
- ¿Cómo acceder al cambio de ubicación en segundo plano para Google Maps android API v2?
- Google Maps API de Android: Error de autorización
- Agrupar los marcadores de mapa en el zoom hacia afuera y el desenclavamiento en el zoom
¿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?
- Seguridad con SharedPreferences
- ¿Cómo obtener el número total de líneas en un proyecto de Android Studio?