IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

mapView.invalidate() depuis un Thread autre que le principal


Sujet :

Android

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 8
    Points : 9
    Points
    9
    Par défaut mapView.invalidate() depuis un Thread autre que le principal
    Bonjour,

    je suis entrain de faire une petite application basée essentiellement sur une carte google map.

    en gros, ce que je fait :
    - je chope la localisation de l'utilisateur
    - je fait une requête vers un site qui me renvoi un certain nombre de points autours de la position de l'utilisateur
    - je crée les marqueurs de chaque point sur la carte.

    mais :
    en attendant de récupérer les points, j'affiche une progressDialog du style "calcul en cours..."
    pour celà je crée une progressDialog, je lance mon traitement dans un nouveau Thread, et à la fin du traitement je fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mc.setCenter(location); // mc ==> mapController
    mapView.invalidate(); //mapView ==> la mapView principale de l'appli
    progressDialog.dismiss(); //je "unset" la progressDialog
    seulement j'ai cette exception srur le mapView.invalidate() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Thread [<9> Thread-16] (Suspended (exception ViewRoot$CalledFromWrongThreadException))	
    	ViewRoot.checkThread() line: 2932	
    	ViewRoot.invalidateChild(View, Rect) line: 642	
    	ViewRoot.invalidateChildInParent(int[], Rect) line: 668	
    	FrameLayout(ViewGroup).invalidateChild(View, Rect) line: 2511	
    	MapView(View).invalidate() line: 5279	
    	NaehActivity$1.run() line: 97

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //cette fonction est appelé quand la localisation change
    public void setLocation(GeoPoint newLocation) {
    	this.location = newLocation;
     
    	progressDialog = ProgressDialog.show(this, getString(R.string.app_name), "Recherche des points les plus proches de votre position...");
     
    	new Thread() {
    		public void run() {
    			Points p = new Points(NaehActivity.this, location);
    			ArrayList<Point> points = p.getPoints();
    			if(points != null && points.size() > 0) {
    				for(Point point : points) {
    					addMarker(point.getLocation(), point.getNom(), point.toString());
    				}
    			}
    			mc.setCenter(location);
    			mapView.invalidate();
    			progressDialog.dismiss();
    		}
    	}.start();
    }

    je précise que je suis débutant dans android, c'est ma 1ère application donc soyez indulgent

    et merci par avance pour vos réponses.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Une remarque peut être bête mais as tu essayé d'inverser les deux lignes suivantes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mapView.invalidate();
    progressDialog.dismiss();
    Autre chose, il n'y a que le Thread principal (le thread Graphique) qui a le droit de modifier des éléments graphiques.

    Il faudrait donc que tu créé un Handler, qui va se charger d'appeler le invalidate()

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    merci Simonmarky pour ta réponse elle m'a guidée vers la solution, j'ai utilsé (en découvrant) l'AsyncTask (c'est génial ce truc) ça fait exactement ce que je voulais en plus classe

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Si votre sujet est résolu merci de bien cliquer sur le bouton en bas de la page.

    Bonne journée
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/07/2011, 00h23
  2. Réponses: 3
    Dernier message: 20/04/2010, 22h43
  3. setCurrent depuis une classe autre que mon midlet
    Par samaury dans le forum Java ME
    Réponses: 2
    Dernier message: 11/11/2008, 09h07
  4. Réponses: 5
    Dernier message: 19/05/2008, 10h31
  5. [THREAD]wait() sur un processus autre que celui courant
    Par GesMo dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 20/03/2008, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo