ce qui rend ma carte fragment de chargement lent?
L'Amélioration De La Performance:
Auparavant, j'ai sauvé TOUS images dans drawable
dossier, cela pourrait être la raison pourquoi la carte se charge tout d'abord lente, lorsque dessiner les marqueurs sur l'écran, l'image peut ne pas s'adapter à la taille de l'écran. Maintenant j'images enregistrées dans drawable-mdpi
, drawable-hdpi
et ainsi de suite, l'application fonctionne plus lisse qu'avant. Espérons que cela aide
Question D'Origine:
J'ai créé une carte dans un fragment, le code source peut être trouvé ci-dessous.
Le fragment de carte est lente lorsque la première fois il charge. Si je vais tout autre fragment et cliquez sur le fragment de carte encore une fois, il charge rapide et pas de limace plus.
Quelqu'un peut me dire ce qui se passe ici? Merci!
fragment_map.xml, id est 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 (contient onCreateView
et 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();
}
}
}
- Avez-vous jamais comprendre quoi que ce soit à ce sujet?
- J'ai ajouté un petit (sale) fixer comme une solution, parce que ce problème existe toujours
Vous devez vous connecter pour publier un commentaire.
Je suis en utilisant un très hackish mais efficace dans mon application, mais il fonctionne bien.
Mon mapFragment n'est pas affichée à droite après l'application est lancée! Sinon, cela n'aurait aucun sens.
Mettre ceci dans votre lanceur de l'activité onCreate:
Cela va créer une mapview dans un thread d'arrière-plan (on est bien loin de l'interface utilisateur), et, avec elle, initialise tous les google play services et des données cartographiques.
Le chargement des données est d'environ 5 MO supplémentaire.
Si quelqu'un a quelques idées d'améliorations n'hésitez pas à commenter s'il vous plaît !
Java 8 Version:
runOnUiThread()
au lieu denew Thread().start()
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
new Thread()
2) Il est encore lent lorsque vous utiliseznew Thread()
et utiliser d'autres du cycle de vie des méthodesmapView.onStart()
,mapView.onStop
...mv.onCreate(null);
et le reste n'est même pas mort! Maintenant code modifiémapView.getMapAsync(this);
aprèsmapView.onCreate(null);
sans nouveau Thread(). Et dansonMapReady()
rappel je ferme écranJuste pour ajouter à @Xyaren réponse, j'ai besoin de travailler pour SupportFragment qui semblaient nécessiter des étapes supplémentaires sont nécessaires. Votre activité mettre en œuvre OnMapReadyCallback.
Dans votre onCreate:
Vous aurez à mettre en œuvre ce:
et dans votre activité mise en page:
Il doit passer par toutes les étapes, y compris l'opération pour Google Play pour télécharger les données de la carte.
J'avais été en cours d'exécution dans ce problème beaucoup trop... s'avère le plus grand coupable, c'était d'avoir une session de débogage attaché à mon application du processus. Les cartes des trucs dans mon application a couru beaucoup plus vite et plus facilement quand j'ai déconnecté le débogueur, ou tout simplement débranché le câble USB.
Découvrez mon poste ici: Premier lancement de l'Activité avec Google Maps est très lent
[ÉDITÉ]
La
getMap()
etsetUpMap()
méthodes sont probablement très lent. Leur traitement doit être fait dans unAsyncTask
de sorte queonCreateView()
pouvez revenir rapidement à chaque fois.Plus d'infos:
onCreateView()
est appelée sur le thread de l'INTERFACE utilisateur, de sorte que la lenteur de la transformation qu'il ne va geler l'INTERFACE utilisateur. VotreAsyncTask
doit faire tous les ralentir le traitement dans sondoInBackground()
méthode, puis mise à jour de l'INTERFACE utilisateur dans sononPostExecute()
méthode. Voir la AsyncTask JavaDoc pour plus de détails.setUpMap
getMap()
peut être lent. Donc, l'appel àgetMap()
devrait être traitée par leAsyncTask
. J'ai édité ma réponse.getMap()
dans mon fragment et manipulée par unAsyncTask
? Si je l'ai mis dans asynctask, comment puis-je savoir le getMap() est prêt autre que null?getMap
. Le retard qui se passe quelque part entreonViewCreated
etonStart
dans ce code.Vous pouvez essayer ce
}
Cette classe étendue de l'Activité