1

J'ai une question sur la façon de rendre une application de navigation plus rapide et plus stable.Problème de performance sur l'application de navigation MapView d'Android

La couche de base de mon application est une carte simple, recouverte de plusieurs superpositions (2 marqueurs pour le départ et la destination et un pour l'itinéraire).

Mon idée est d'implémenter un thread pour afficher la route, afin que l'application ne raccroche pas lors du calcul d'une route plus complexe (comme c'est le cas actuellement).

Après la mise en œuvre du fil, il n'y a pas de mises à jour spectacles de plus, vous pouvez peut-être me aider avec un petit coup d'œil à un extrait de mon code ci-dessous:

private class MyLocationListener implements LocationListener { 
    @Override 
    public void onLocationChanged(Location loc) { 
     posUser = new GeoPoint((int) (loc.getLatitude() * 1E6), (int) (loc 
       .getLongitude() * 1E6)); 

     new Thread(){ 
     public void run(){ 
      mapView.invalidate(); 

      // Erase old overlays 
      mapView.getOverlays().clear(); 

      // Draw updated overlay elements and adjust basic map settings 
      updateText(); 
      if(firstRefresh){ 
       adjustMap(); 
       firstRefresh = false; 
      } 
      getAndPaintRoute(); 
      drawMarkers(); 
     } 
     }; 
    } 

Certaines fonctionnalités ont été résumées à une méthode comme " drawMarkers() "ou" updateText() "... (ils n'ont pas besoin de plus d'attention ;-))

Répondre

2

Quand demandez-vous réellement le fil à exécuter? Je vois seulement le code pour en créant il. Si vous le faisiez, vous découvrirez que seul le thread principal (UI) est autorisé à mettre à jour, comme le note RPond.

Au lieu de cela, divisez votre travail et post the results back to the main thread via a Handler.

+0

salut, vous avez raison, je n'ai pas commencé le fil * honte *. Maintenant, ma route est affichée, je vais avoir quelques tests sur les performances ;-) – poeschlorn

+0

Note: Je pense que vous êtes dans un comportement non pris en charge/indéfini lorsque vous mettez à jour en dehors du thread principal de l'interface utilisateur. Le modèle Handler est votre ami. –

+0

et qu'en est-il de l'utilisation d'une méthode synchronisée pour mettre à jour la carte? – poeschlorn

0

Vous ne pouvez mettre à jour l'interface utilisateur sur le thread d'interface utilisateur, donc je pense que c'est le problème. Découvrez ce article sur le filetage des solutions à ce problème.

0

Je suis peut-être en train d'aboyer le mauvais arbre ici, mais je suppose que c'est quelque chose à voir avec le fait que vous apportez des modifications à MapView sur un thread qui n'est pas le thread de l'interface utilisateur.

Je pense que cela le résultat dans l'une de ces possibilités:

  • Vos modifications sont lancer une exception que vous ne voyez pas (encore une fois peut-être parce qu'il est sur un autre thread)
  • Vos modifications sont être ignoré parce qu'ils sont faits sur le mauvais fil.
  • La carte est en cours de mise à jour mais votre thread d'interface utilisateur ne sait pas qu'il doit redessiner la carte.

Espérons que cela aide - au moins en vous indiquant vaguement dans la bonne direction.

0

Nous espérons que vous n'utiliserez pas Google MapView pour le rendu de votre navigation, puisque, d'après ma lecture des termes et conditions, la navigation n'est pas incluse dans la politique d'utilisation acceptable.

De l'Android Maps APIs Terms of Service

En vertu de ce chapitre 8, vous ne devez pas (ni autoriser quiconque à):

...

8.7. utiliser le Service ou le Contenu avec des produits, systèmes ou applications pour ou en rapport avec (a) une navigation en temps réel ou un guidage routier basé sur la saisie de la position d'un capteur (incluant mais non limité à tout itinéraire visuel ou auditif virage par virage orientation);

...