Lo que hace que mi fragmento de mapa de carga lento?

Mejora del rendimiento:

Anteriormente salvé TODAS las imágenes en carpeta drawable , esto podría ser la razón por la que el mapa primero carga lento, cuando dibujar los marcadores en la pantalla, la imagen puede no ajustarse al tamaño de la pantalla. Ahora drawable-mdpi imágenes en drawable-mdpi , drawable-mdpi drawable-hdpi y así sucesivamente, la aplicación funciona más suave que antes. Espero eso ayude

Pregunta original:

He creado un mapa en un fragmento, el código fuente se puede encontrar a continuación.

El fragmento de mapa es lento cuando se carga por primera vez . Si voy a cualquier otro fragmento y haga clic en el fragmento de mapa de nuevo, se carga rápidamente y no slug más.

¿Puede alguien decirme qué está pasando aquí? ¡Gracias!

Fragment_map.xml, id es el map

 <?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.google.android.gms.maps.SupportMapFragment"/> 

MyMapFragment.java (contiene onCreateView y setUpMapIfNeeded )

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { try { rootView = inflater.inflate(R.layout.fragment_map, container, false); } catch (InflateException e) { /* map is already there, just return view as it is */ Log.e(TAG, "inflateException"); } setUpMapIfNeeded(); return rootView; } public void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the fragment_map. if (myMap == null) { // Try to obtain the fragment_map from the SupportMapFragment. myMap = ((SupportMapFragment) MainActivity.fragmentManager.findFragmentById(R.id.map)).getMap(); // Check if we were successful in obtaining the fragment_map. if (myMap != null) { setUpMap(); } } } 

Estoy usando una forma muy hackish pero eficaz en mi aplicación, pero funciona bien. ¡Mi mapFragment no se muestra inmediatamente después de que se inicie la aplicación! De lo contrario esto no tendría sentido.

Ponga esto en la actividad onCreate de su lanzador:

  // Fixing Later Map loading Delay new Thread(new Runnable() { @Override public void run() { try { MapView mv = new MapView(getApplicationContext()); mv.onCreate(null); mv.onPause(); mv.onDestroy(); }catch (Exception ignored){ } } }).start(); 

Esto creará un mapview en un hilo de fondo (muy lejos del ui) y con él, inicializa todos los servicios de Google Play y datos de mapas.

Los datos cargados son de aproximadamente 5 MB extra.

Si alguien tiene algunas ideas para las mejoras, no dude en comentar por favor!


Java 8 Versión:

 // Fixing Later Map loading Delay new Thread(() -> { try { MapView mv = new MapView(getApplicationContext()); mv.onCreate(null); mv.onPause(); mv.onDestroy(); }catch (Exception ignored){} }).start(); 

Sólo para añadir a la respuesta @ Xyaren, que necesitaba para trabajar para SupportFragment que parecía requerir algunos pasos adicionales. Haga que su actividad implemente OnMapReadyCallback.

En su onCreate:

  new Thread(() -> { try { SupportMapFragment mf = SupportMapFragment.newInstance(); getSupportFragmentManager().beginTransaction() .add(R.id.dummy_map_view, mf) .commit(); runOnUiThread(() -> mf.getMapAsync(SplashActivity.this)); }catch (Exception ignored){ Timber.w("Dummy map load exception: %s", ignored); } }).start(); 

Tendrás que implementar esto:

 @Override public void onMapReady(GoogleMap googleMap) { // Do nothing because we only want to pre-load map. Timber.d("Map loaded: %s", googleMap); } 

Y en el diseño de su actividad:

 <FrameLayout android:id="@+id/dummy_map_view" android:layout_width="match_parent" android:layout_height="0dp" android:visibility="gone"/> 

Debe realizar todos los pasos, incluida la transacción de Google Play Services para descargar los datos del mapa.

Yo había estado corriendo en este problema demasiado … Resulta que el mayor culpable era tener una sesión de depuración adjunta al proceso de mi aplicación. Las cosas de mapas en mi aplicación se ejecutaron mucho más rápido y más suavemente cuando desconecté el depurador, o simplemente desenchufé el cable USB.

Echa un vistazo a mi post relacionado aquí: Primer lanzamiento de la actividad con Google Maps es muy lento

[EDITADO]

Los getMap() y setUpMap() probablemente sean muy lentos. Su procesamiento debe realizarse en un AsyncTask para que onCreateView() pueda volver rápidamente cada vez.

Más información: onCreateView() se llama en el hilo de interfaz de usuario, por lo que cualquier procesamiento lento que hace se congelará la interfaz de usuario. Su AsyncTask debe hacer todo el procesamiento lento en su método doInBackground() y, a continuación, actualizar la interfaz de usuario en su método onPostExecute() . Consulte el AsyncTask JavaDoc para obtener más detalles.

Usted podría intentar esto

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mapActivity); getSreenDimanstions(); fragment = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)); map = fragment.getMap(); 

}

Esta clase amplió la Actividad

  • Animar un coche (Marcador) a lo largo de un camino en google map android
  • MapView (mapas de android api v2) dentro de la distribución de fragmentos no muestra
  • API de Google Maps v2 en el cuadro de diálogo
  • Cómo cargar la imagen de la URL de carga de perezosos en Google Maps
  • Cambiar el tamaño del marcador en Google Maps API v2
  • Cómo adjuntar un marcador flexible en el mapa algo así como Uber y Lyft?
  • Personalizada coloreada como marcador de mapa en Google Maps API v2 - Android
  • TileProvider utilizando azulejos locales
  • Identificar si el punto está en el polígono
  • La mejor forma de volver a crear marcadores / polilíneas cuando se gira el teléfono (cambio de orientación)
  • Cómo obtener la ubicación de Google Map después de soltar Pin sobre ella
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.