varios una ubicacion studio obtener marcadores localizacion hacer google geolocalizacion example crear como app aplicacion agregar android google-maps

una - google maps android studio



El primer lanzamiento de Activity con Google Maps es muy lento (7)

De acuerdo, solo tuve el mismo problema y creo, después de ver esta pregunta, que no hay una solución "agradable".

Mi truco actual es retrasar la adición del fragmento, dando a la actividad la oportunidad de representar todo lo demás antes de agregar el mapa.

Ahora, estoy incrustando el mapa como un fragmento de elementos secundarios, por lo que mi código se ve así:

// inside onCreateView new Handler().postDelayed(new Runnable() { @Override public void run() { if (isAdded()) { FragmentManager fm = getChildFragmentManager(); GoogleMapFragment mapFragment = GoogleMapFragment .newInstance(); fm.beginTransaction() .replace(R.id.mapContainer, mapFragment).commit(); } } }, 1000);

si se agrega directamente a la actividad, podría verse así:

// inside onCreate new Handler().postDelayed(new Runnable() { @Override public void run() { if (!isFinishing()) { FragmentManager fm = getFragmentManager(); GoogleMapFragment mapFragment = GoogleMapFragment .newInstance(); fm.beginTransaction() .replace(R.id.mapContainer, mapFragment).commit(); } } }, 1000);

Sin embargo, se necesita un control dentro de Runnable para garantizar que no estamos tratando de agregar el mapa a alguna Actividad o Fragmento no existente.

No soy partidario de retrasos codificados como este, así que regresaré si encuentro algo mejor. 1 segundo debería ser suficiente sin embargo, y probablemente podría ser aún menos.

Quiero tener SupportMapFragment en una de mis actividades. Agregué este fragmento directamente a layout xml y este diseño se configuró como vista de contenido. Pero cuando la actividad se inicia por primera vez, lleva demasiado tiempo (más de 1 segundo). Los siguientes lanzamientos están bien y toman unos pocos milisegundos.

Lo intenté:

  • eliminar cualquier inicialización
  • utilice MapFragment en lugar de SupportMapFragment
  • agregar MapFragment programáticamente

pero nada ayudó. El mapa se muestra sin ningún problema o registro sospechoso.

¿Tiene alguna sugerencia, qué causa y cómo mejorarla?

editar: tengo un ListView y cuando el usuario hace clic en Item, inicia DetailActivity con MapFragment. Después de hacer clic en el elemento hay un retraso notable antes de que aparezca DetailActivity. Solo el método onCreate, donde llamo a setContentView, se ejecuta durante más de 1 segundo. Y mientras la actividad está en el método de creación, no hay contenido visible de esta actividad. Esta demora entre hacer clic y mostrar contenido no es muy fácil de usar.

Gracias


La razón por la cual la primera carga lleva tanto tiempo se debe a que las API de Play Services deben cargarse como se ve en las líneas de registro:

I/Google Maps Android API﹕ Google Play services client version: 6587000 I/Google Maps Android API﹕ Google Play services package version: 6768430

Desafortunadamente, el "paquete" tarda aproximadamente un segundo en cargarse y usar MapsInitializer solo le permitirá obtener el "cliente". Así que aquí hay un trabajo no tan lindo: Inicialice un mapa ficticio en su actividad principal de iniciador.

mDummyMapInitializer.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { Log.d(TAG, "onMapReady"); } });

Ahora, cuando cargue su mapa real más adelante, no debería tener que inicializar las API de servicios de Play. Esto no debería causar retrasos en su actividad principal, ya sea porque el método async se ejecuta fuera del hilo principal.

Como tiene que hacer la inicialización en cualquier lugar, no importa qué, creo que tiene sentido hacerlo bien cuando se inicia la aplicación, de modo que cuando carga una actividad que realmente necesita un mapa, no tiene que esperar en absoluto.

Nota: mDummyMapInitializer debe ser un MapFragment o MapFragment y debe agregarse a la actividad, de lo contrario, las API de Play Services no se cargarán. El método getMapAsync también debe llamarse desde el hilo principal.


Lo solucioné usando MapsInitializer en mi Application.onCreate ():

MapsInitializer.initialize(this);

¡Buenos resultados y solución más limpia (y no hacky)!


Para mí fue mucho más lento que 1 segundo porque estaba usando:

mapFragment.getMap();

Luego cambié a:

mapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { map = googleMap; } });

El uso de getMapAsync () no bloqueará la interfaz de usuario, por lo que su actividad se cargará antes que el mapa. Todavía es lento, pero para mis propósitos, estaba bien con solo mostrar un mensaje de carga.


Similar a las otras soluciones aquí, pero usando RxJava + RxAndroid.

Simplemente llame a este fragmento desde la actividad del onCreate .

Observable.fromCallable(new Callable<Void>() { @Override public Void call() { MapView mapView = new MapView(LaunchActivity.this); // Replace LaunchActivity with appropriate activity''s name mapView.onCreate(null); return null; } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe( new Action1<Void>() { @Override public void call(Void ignorable) { Log.i("Google Maps", "Initialised Google Maps."); } }, new Action1<Throwable>() { @Override public void call(Throwable ignorable) { Log.w("Google Maps", "[EXPECTED] Initialized Google Maps but got: " + ignorable.getMessage()); } });


También he estado combatiendo este problema y he encontrado mejoras considerables al hacer lo siguiente:

1) Desconecte su cable USB (o desconecte su sesión de depuración) y vuelva a intentarlo. Google Maps en una aplicación es mucho más lento cuando hay una sesión de depuración activa. Desconecte el depurador y se vuelve mucho más rápido ... aún así no es el más rápido, pero al menos es aceptable.

2) No llame a setMapType () a menos que ya haya llamado a getMapType () y haya confirmado que es diferente de lo que desea configurar. Múltiples llamadas para el mismo tipo de mapa aún harán que se restablezca cada vez, lo que puede llevar tiempo.

3) Agregue el fragmento de mapa programáticamente, similar a lo que @cYrixmorten publicó, pero lo hago desde un hilo de fondo iniciado al final de mi onResume (), que luego espera 50ms y luego lo ejecuta en el hilo de UI. Esto evita que toque el hilo de la interfaz de usuario de inmediato, por lo que le da tiempo a la actividad para cargar y mostrar; al menos deberías estar en la pantalla mientras el mapa posiblemente lo está sofocando.

El problema aquí es que desea crear una nueva instancia de MapFragment solo una vez por Actividad, no cada vez que se gira la orientación de la pantalla. Lo que hago es llamar a "getFragmentManager (). FindFragmentById (R.id.mapContainer)", que me dará el manejador de fragmento de mapa de la última vez, o un valor nulo si es la primera vez (en cuyo caso crearé el fragmento del mapa y haz el FragmentManager.replace ()).


Tengo una actividad "principal" y una actividad con mapView. Cuando esa activity-with-mapView comienza por primera vez, es realmente lenta.

La publicación de Clocksmith me dio una idea para comenzar la inicialización de la actividad principal en un hilo separado. Y realmente soluciona el problema.

Aquí está mi código de la actividad "principal":

public void onCreate(Bundle savedInstanceState) { ... Runnable initMap = () -> { BaseApplication.d("Start init mapView"); MapView mapView = new MapView(MainActivity.this); mapView.onCreate(null); BaseApplication.d("... done"); }; new Thread(initMap).start(); }

mapView nunca se usa, solo para fines de inicialización.

Y aquí hay un seguimiento de pila, solo para información:

12-09 19:31:54.442 17172-17341/my.app D/XXX: Start init mapView 12-09 19:31:54.525 17172-17341/my.app I/zzy: Making Creator dynamically 12-09 19:31:55.007 17172-17341/my.app D/ChimeraCfgMgr: Reading stored module config 12-09 19:31:55.153 17172-17341/my.app D/ChimeraCfgMgr: Loading module com.google.android.gms.maps from APK /data/user/0/com.google.android.gms/app_chimera/chimera-module-root/module-71c764a6f3cb92bdc5525a965b589e7c5ed304f3/MapsModule.apk 12-09 19:31:55.154 17172-17341/my.app D/ChimeraModuleLdr: Loading module APK /data/user/0/com.google.android.gms/app_chimera/chimera-module-root/module-71c764a6f3cb92bdc5525a965b589e7c5ed304f3/MapsModule.apk 12-09 19:31:55.262 17172-17341/my.app D/ChimeraFileApk: Primary ABI of requesting process is armeabi-v7a 12-09 19:31:55.271 17172-17341/my.app D/ChimeraFileApk: Classloading successful. Optimized code found. 12-09 19:31:55.316 17172-17341/my.app W/System: ClassLoader referenced unknown path: /data/user/0/com.google.android.gms/app_chimera/chimera-module-root/module-71c764a6f3cb92bdc5525a965b589e7c5ed304f3/native-libs/armeabi-v7a 12-09 19:31:55.317 17172-17341/my.app W/System: ClassLoader referenced unknown path: /data/user/0/com.google.android.gms/app_chimera/chimera-module-root/module-71c764a6f3cb92bdc5525a965b589e7c5ed304f3/native-libs/armeabi 12-09 19:31:55.618 17172-17341/my.app I/Google Maps Android API: Google Play services client version: 7571000 12-09 19:31:55.630 17172-17341/my.app I/Google Maps Android API: Google Play services package version: 8489438 12-09 19:31:55.969 17172-17341/my.app I/e: Token loaded from file. Expires in: 423267993 ms. 12-09 19:31:55.969 17172-17341/my.app I/e: Scheduling next attempt in 422967 seconds. 12-09 19:31:56.338 17172-17341/my.app D/XXX: ... done

Como podemos ver, realmente toma mucho tiempo ...