showinfowindow poner marcador mapas infowindows google como agregar java android performance google-maps google-maps-markers

java - poner - Android Google Map addMarker() muy lento al agregar 400 marcadores



google maps android infowindow (2)

Gracias por tomarse el tiempo de leer esto.

Publiqué una aplicación en la tienda de Google Play hace aproximadamente un mes (29/08/14) y esto no fue un problema con la misma cantidad de marcadores. Esta semana, cuando me acerqué a mi aplicación, noté que cargar los 400 marcadores en el mapa llevaba unos 10-20 segundos en mi Galaxy S5 y que había un pequeño círculo en el medio de los iconos de marcador predeterminados. Antes de esto, el mapa se cargó en menos de un segundo. No actualicé ni cambié mi aplicación. Supongo que Google actualizó la API de Google Map y el cambio hizo que fuera mucho más lento cargar marcadores. ¿Le ha pasado esto a alguien más? ¿Alguien más tiene información sobre esto?

Mi aplicación está disponible de forma gratuita en Play Store. Puede buscar NYS Canal Guide para encontrarlo si desea ver qué tan lento se carga.

Este método se llama en el onCreateView () del fragmento del mapa una vez que se inicializa el mapa:

private void addExistingMarkersToMap(){ log("Adding existing markers to the map. poiAdapter size = " + poiAdapter.getCount()); Marker marker; MarkerOptions markerOptions; for(MapMarker mapMarker : poiAdapter){ if(markersNotFilteredOut(mapMarker)){ markerOptions = mapMarker.getMarkerOptions(); if(markerOptions != null && mapMarker != null){ marker = mMap.addMarker(markerOptions); mapMarker.setMarker(marker); } } } }

Este es el método getMarkerOptions () en una clase MapMarker:

public MarkerOptions getMarkerOptions() { return new MarkerOptions() .title(name) .position(new LatLng(lat, lng)) .snippet(bodyOfWater + ", mile " + mile) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)); }

El código fuente completo está aquí: github.com/olearyj234/NYS-Canal-Guide

EDITAR:

** Para ser específico, la única parte que es lenta es cargar los marcadores cuando el mapa se está inicializando (por lo tanto, también cuando se cambia de una pestaña de navegación y vuelve a la pestaña del mapa). No es lento cuando mueves el mapa o cualquier otra cosa.

Aquí hay algunos registros que aparecen:

Mientras la pantalla se congela durante unos segundos (5-15) porque está cargando los marcadores, este registro se está produciendo muy rápido. El ID de mapa de bits continúa incrementándose en uno y mientras los marcadores se están cargando, produce alrededor de 400 de estos registros. Esto muestra que tiene que haber un problema relacionado con la carga de los mapas de bits de marcador en la pantalla. Estoy usando el mapa de bits del marcador predeterminado.

10-01 15:45:07.222: D/skia(32108): GFXPNG PNG bitmap created width:16 height:32 bitmap id is 414

Este registro se produce cuando la aplicación termina de cargar todos los marcadores en el mapa.

10-01 15:51:09.402: I/Choreographer(8353): Skipped 1130 frames! The application may be doing too much work on its main thread.

Este registro se produce 14 veces cuando la aplicación termina de cargar todos los marcadores en el mapa.

10-01 15:59:13.882: I/dalvikvm-heap(8353): Grow heap (frag case) to 40.668MB for 4194320-byte allocation

EDICION 2:

Acabo de comprobar para ver cuánto tiempo tomaría para ciertas líneas de código. Utilicé System.currentTimeMillis(); para obtener tiempos En el método addExistingMarkersToMap() , esta es la línea que tardó mucho: marker = mMap.addMarker(markerOptions); Al agregar los 400 marcadores, tomó 54 ms en promedio para cada marcador. El tiempo mínimo fue de 34 ms y el máximo fue de 114 ms.

Si hay más información que crees que debería proporcionar, házmelo saber en un comentario. ¡Gracias!


Este parece ser un nuevo problema introducido en Google Maps API v2 (parece una de las actualizaciones de Play Services 6), consulte # 7174 para obtener más información (y por favor ejecútelo ).

De la información proporcionada en el problema, el problema parece ser específico al uso de un marcador predeterminado con un matiz , por ejemplo:

BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)

Hay algunas soluciones. Lo más fácil es no proporcionar un matiz (si todos los marcadores que son rojos son aceptables):

BitmapDescriptorFactory.defaultMarker()

O usa los dibujos personalizados:

BitmapDescriptorFactory.fromResource(R.drawable.map_marker)

Veo una ralentización ~ 2000 veces cuando uso el marcador predeterminado con un matiz. Voy con los productos personalizados personalizados como una solución por ahora.


Tengo entendido que cada vez que dibuja un marcador envía las operaciones de dibujo a un grupo de subprocesos en el fondo mientras devuelve el marcador. Es fácil abrumar a la CPU inundando la solicitud demasiado rápido.
Utilice el controlador del engarzador principal y publique el retraso en intervalos cada vez mayores para distribuir las operaciones como se indica en el siguiente código.

Handler handler = new Handler(Looper.getMainLooper()); int x = 0; long DELAY = 10; for(MapMarker mapMarker : poiAdapter){ if(markersNotFilteredOut(mapMarker)){ markerOptions = mapMarker.getMarkerOptions(); if(markerOptions != null && mapMarker != null){ handler.postDelayed( new Runnable() { @Override public void run() { marker = mMap.addMarker(markerOptions); mapMarker.setMarker(marker); } }, (DELAY * (long)x++)); } } }