Amélioration de performance:
Auparavant, j’enregistraisALLimages dans le dossier drawable
, c’est peut-être pour cette raison que la carte se charge tout d'abord lentement. Lorsque vous dessinez les marqueurs à l’écran, l’image peut ne pas correspondre à la taille de l’écran. Maintenant J'ai enregistré les images dans drawable-mdpi
, drawable-hdpi
et ainsi de suite, l'application est plus fluide qu'auparavant. J'espère que ça aide
Question originale:
J'ai créé une carte dans un fragment, le code source se trouve ci-dessous.
Le fragment de carte est lent quand la première fois il se charge. Si je vais n'importe quel autre fragment et que je clique à nouveau sur le fragment de carte, il se charge rapidement et ne contient plus de slug.
Quelqu'un peut-il me dire ce qui se passe ici? Merci!
fragment_map.xml, l'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();
}
}
}
J'utilise un moyen très rudimentaire mais efficace dans mon application, mais cela fonctionne bien . Mon mapFragment ne s'affiche pas juste après le lancement de l'application! Sinon, cela n'aurait aucun sens.
Mettez ceci dans votre activité de lancement de surCréer :
// 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();
Cela créera une vue cartographique dans un fil d’arrière-plan (loin de l’interface utilisateur) et initialisera tous les services Google Play et les données cartographiques.
Les données chargées font environ 5 Mo supplémentaires.
Si quelqu'un a des idées d'amélioration, n'hésitez pas à commenter s'il vous plaît!
Version 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();
Pour ajouter à la réponse de @ Xyaren, j’avais besoin que cela fonctionne pour SupportFragment, qui semblait nécessiter quelques étapes supplémentaires. Demandez à votre activité d'implémenter OnMapReadyCallback.
Dans votre 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();
Vous devrez implémenter ceci:
@Override
public void onMapReady(GoogleMap googleMap) {
// Do nothing because we only want to pre-load map.
Timber.d("Map loaded: %s", googleMap);
}
et dans la structure de votre activité:
<FrameLayout
Android:id="@+id/dummy_map_view"
Android:layout_width="match_parent"
Android:layout_height="0dp"
Android:visibility="gone"/>
Il doit suivre toutes les étapes, y compris la transaction pour les services Google Play, afin de télécharger les données cartographiques.
Je rencontrais beaucoup ce problème aussi… Il s'avère que le plus gros coupable était d'avoir une session de débogage attachée au processus de mon application. Les éléments de carte dans mon application ont fonctionné beaucoup plus rapidement et plus facilement lorsque j'ai déconnecté le débogueur ou simplement débranché le câble USB.
Découvrez mon article lié ici: Le premier lancement d’Activité avec Google Maps est très lent
[ÉDITÉ]
Les méthodes getMap()
et setUpMap()
sont probablement très lentes. Leur traitement doit être effectué dans une AsyncTask
afin que onCreateView()
puisse revenir rapidement à chaque fois.
Plus d'infos: onCreateView()
est appelé sur le thread d'interface utilisateur, ainsi tout traitement lent qu'il effectuera gèlera l'interface utilisateur. Votre AsyncTask
doit effectuer tout le traitement lent dans sa méthode doInBackground()
, puis mettre à jour l'interface utilisateur dans sa méthode onPostExecute()
. Voir le AsyncTask JavaDoc pour plus de détails.