Premier lancement de l'Activité avec Google Maps est très lent
Je veux avoir SupportMapFragment dans un de mes Activités. J'ajoute ce fragment directement à la mise en page xml et cette mise en page définie comme l'affichage du contenu. Mais lorsque l'Activité est lancé pour la première fois, il prend trop de temps (plus de 1 seconde). Suivant les lancements sont ok et prendre quelques millisecondes.
J'ai essayé:
- supprimer toute initialisation
- utilisation MapFragment au lieu de SupportMapFragment
- ajouter MapFragment par programmation
mais rien n'y fit. La carte est affiché sans aucun problème ou suspects journal.
Avez-vous de la suggestion, de ce qu'elle provoque et comment l'améliorer?
edit:
J'ai une ListView et lorsque l'utilisateur clique sur un Élément, il se lance DetailActivity avec MapFragment. Après cliquez sur l'élément, il existe un retard notable avant DetailActivity montre. Seule méthode onCreate, où j'appelle setContentView, gère plus de 1 seconde. Et alors que l'activité est dans la méthode onCreate, il n'y a pas de contenu visible de cette activité. Ce délai entre le clic et l'affichage du contenu n'est pas très convivial.
Merci
- Que voulez-vous dire par "Il n'est pas possible"? Et par "faux"?
- Ya bien sûr... Mapview besoin d'un temps à charger et c'est autour de 10 seconde. et laissez-moi être clair sur autre chose si vous avez utilisé Intention Explicite, puis il va prendre du temps pour accéder à un autre écran et c'est autour de 10 seconde.
- Ok, maintenant, je comprends ce que tu veux dire. L'initialisation de MapFragment ne prend pas 1 seconde, mais le lancement de l'Activité avec MapFragment prend plus de 1 seconde. J'ai ajouté à la question, ce qui se passe dans l'application et ce que je veux dire par 1 seconde de retard.
- ya exactement. C'est ce que je suis parler au sujet de.
- Désolé, mais je ne pas acheter ce que explenation et de la réponse. En particulier, quand il y a une autre application sans ce problème. Par exemple Google I/O 2014 de l'application.
- Je suis également confronté à ce problème. Dans mon application, j'ai l'affichage de la carte dans plusieurs activités. La première fois que j'ai commencer toute activité avec une carte, il prend plus de temps que les fois suivantes.
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle le premier chargement prend tellement de temps est parce que le Jeu Api de Services ont à charge comme on le voit dans les lignes du journal:
Malheureusement, le "package" on prend environ une seconde à se charger et à l'aide de la MapsInitializer seulement vous obtenir le "client". Voici donc un donc un joli travail autour de: Initialiser un mannequin carte dans votre main lanceur d'activité.
Maintenant, quand vous chargez votre carte actuelle plus tard, il ne devrait pas avoir à initialiser le Jeu Api de services. Cela ne devrait pas causer des retards dans votre activité principale, soit parce que la méthode asynchrone s'exécute hors du thread principal.
Depuis que vous avez à faire l'initialisation, quelque part, n'importe quoi, je pense qu'il est judicieux de le faire à droite au démarrage de l'application, de sorte que lorsque vous chargez une activité qui a réellement besoin d'une carte, vous n'avez pas à attendre à tout.
Remarque:
mDummyMapInitializer
doit être unMapFragment
ouSupportMapFragment
et doit être ajoutée à l'activité, ou bien le Jouer les Api de Services ne seront pas chargés. LegetMapAsync
méthode elle-même doit également être appelé à partir du thread principal.Ok, donc j'ai juste eu le même problème et je pense, après le visionnement de cette question, qu'il n'y a pas de "bonne" solution.
Mon hack est de retarder l'ajout du fragment, en donnant à l'Activité d'une chance de rendre tout le reste avant l'ajout de la carte.
Maintenant, je suis l'incorporation de la carte comme un childfragment, donc mon code ressemble à ceci:
si l'ajouter directement à l'Activité, il pourrait ressembler à ceci:
Néanmoins, une vérification à l'intérieur de l'Exécutable est nécessaire pour assurer que nous ne sommes pas en train d'ajouter la carte à certains non-Activité existante ou Fragment.
Je ne suis pas un fan de codé en dur retards de ce genre, il en sera de retour, si j'arrive avec quelque chose de mieux. 1 seconde devrait être beaucoup moins et pourrait probablement être même moins.
Je l'ai résolu en utilisant MapsInitializer dans mon Application.onCreate():
De bons résultats et plus propre (et pas hacky) la solution!
J'ai été la lutte contre ce problème, et ont trouvé des améliorations considérables en procédant comme suit:
1) Débranchez votre câble USB (ou autre déconnecter de votre session de débogage) et essayez à nouveau. Google Maps dans une application est beaucoup plus lente lors d'une session de débogage est activé. Débranchez le débogueur et il devient beaucoup plus vite... c'est toujours certainement pas le plus rapide, mais c'est au moins acceptable.
2) Ne pas appeler setMapType (), sauf si vous avez déjà appelé getMapType() et a confirmé que c'est différent de ce que vous voulez configurer. Plusieurs appels pour le même Type de Carte sera toujours provoquer la remise à zéro à chaque fois, ce qui peut prendre du temps.
3) Ajouter le fragment de Carte de la programmation, similaire à ce que @cYrixmorten posté, mais je le fais à partir d'un thread d'arrière-plan a commencé à la fin de mon onResume(), qui attend alors que 50ms puis l'exécute sur le thread d'INTERFACE utilisateur. Cela l'empêche de frapper le thread de l'INTERFACE utilisateur, afin que donne le temps d'Activité pour charger et afficher; vous devez au moins être sur l'écran pendant que la carte est peut-être l'étouffement de tout.
Le hic ici est que vous voulez créer un nouveau MapFragment exemple qu'une seule fois par Activité, pas tout le temps l'orientation de l'écran est tourné. Ce que j'ai à faire est d'appeler "getFragmentManager().findFragmentById(R. id.mapContainer)", qui sera soit me donner le fragment de carte de la poignée de la dernière fois, ou null si c'est la première fois (dans ce cas, je vais créer le fragment de carte et ne la FragmentManager.replace() ).
onResume()
pour ajouter le fragment de carte? Quel avantage en termes de vitesse est le plusonCreate()
?J'ai un "principal" de l'activité et une activité avec mapView. Lorsque cette activité avec mapView démarre pour la première fois, il est vraiment lent.
horloger du post m'a donné une idée pour démarrer l'initialisation à partir de l'activité principale dans un thread séparé. Et il résout vraiment le problème.
Voici mon code à partir de "principal" de l'activité:
mapView n'est jamais utilisé seul pour l'initialisation but.
Et ici est une trace de la pile - juste pour info:
Comme nous pouvons le voir, il prend vraiment beaucoup de temps...
Pour moi, il était beaucoup plus lent que 1sec beause j'ai été en utilisant:
Puis j'ai changé pour:
À l'aide de la getMapAsync() l'habitude de bloquer l'interface utilisateur, de sorte que votre activité aura la charge avant de la carte. Il est toujours lent, mais pour ma part c'est ok avec juste montrer un message de chargement.
Similaire aux autres solutions ici, mais à l'aide de RxJava + RxAndroid.
Suffit d'appeler cet extrait à partir de l'écran de lancement de l'activité
onCreate
.J'ai eu le même problème et la MapsInitializer astuce ne fonctionne pas pour moi.
La meilleure solution au problème, à mon humble avis, est de charger à la main le Fragment de Carte comme décrit à partir d'autres utilisateurs. Ce n'est pas une hacky solution, vous avez juste à gérer vous-même le fragment instance