studio programacion porque pone móviles mapas lento google funciona desarrollo curso carga aplicaciones android android-maps-v2 android-maps

porque - manual de programacion android pdf



¿Qué hace que la carga de mi fragmento de mapa sea lenta? (5)

Mejora del rendimiento:

Anteriormente guardaba TODAS las imágenes en una carpeta drawable , esta podría ser la razón por la que el mapa se carga lentamente, cuando se dibujan los marcadores en la pantalla, es posible que la imagen no se ajuste al tamaño de la pantalla. Ahora guardo las imágenes en drawable-mdpi , drawable-mdpi , etc., la aplicación funciona mejor que antes. Espero eso ayude

Pregunta original:

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

El fragmento del mapa es lento cuando se carga por primera vez . Si voy a cualquier otro fragmento y vuelvo a hacer clic en el fragmento del mapa, se carga rápido y ya no hay babosas.

¿Alguien puede decirme qué está pasando aquí? ¡Gracias!

fragment_map.xml, id es 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 intrincada pero efectiva en mi aplicación, pero funciona bien. ¡Mi mapFragment no se muestra justo después de que se inicie la aplicación! De lo contrario, esto no tendría sentido.

Pon esto en la actividad de tu lanzador enCreate :

// 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á una vista de mapa en un hilo de fondo (lejos de la interfaz de usuario) y, con ella, inicializa todos los servicios de Google Play y datos de mapas.

Los datos cargados son unos 5MB extra.

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

Versión de Java 8:

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


Podrías probar 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 extendió la actividad.


Solo para agregar a la respuesta de @ Xyaren, necesitaba que funcionara 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 pasar por todos los pasos, incluida la transacción para que Google Play Services descargue los datos del mapa.


También me había estado topando con este problema ... Resulta que el mayor culpable fue tener una sesión de depuración adjunta al proceso de mi aplicación. Las cosas de los mapas en mi aplicación se ejecutaron mucho más rápido y sin problemas cuando desconecté el depurador, o simplemente desconecté el cable USB.

Mira mi publicación relacionada aquí: El primer lanzamiento de Activity con Google Maps es muy lento


[Editado]

Los getMap() y setUpMap() son probablemente muy lentos. Su procesamiento debe hacerse en una AsyncTask para que onCreateView() pueda regresar rápidamente cada vez.

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