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
- ¿Cuál es la forma recomendada de usar Google Map v2 dentro del fragmento?
- Dibuja una forma personalizada en android utilizando XML
- Barra de herramientas no aparece en fragmento con google maps
- ¿Es posible establecer la clave de la API de Google Maps v2 mediante programación?
- Android: Cómo dibujar las direcciones de la ruta google maps API V2 desde la ubicación actual hasta el destino
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(); } } }
- Android Google Maps v2, MAP_TYPE_NONE y cuadrados negros
- TileProvider método getTile - necesita traducir xyy a lat / long
- Google Maps Android API v2 SoporteMapFragmento de pérdida de memoria
- Android Google Map error android.view.InflateException: Archivo XML binario línea # 6: error iniciando el fragmento de clase
- ¿Hay una manera de aplicar esquinas redondeadas a un Mapfragment?
- La importación android.support.v7.app.MediaRouteActionProvider no se puede resolver
- Google Map Android API v2: GoogleMap es nulo
- Google Maps API v2: ¿Cómo hacer que los marcadores no se puedan hacer clic?
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
- Línea de dibujo de lienzo de Android – hacer la línea más gruesa
- ¿Qué edición de Java se está utilizando en Android J2ME o Java SE?