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 :

Accès à une variable - Classe, Thread - Développement Android


Sujet :

Android

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Accès à une variable - Classe, Thread - Développement Android
    Bonjour je débute en java, et j'éssaye de récupérer la position gps d'un téléphone sous android.

    Mon principale problème est que j'ai besoin de récupérer la variable object (de type JSONObject) dans ma fonction onLocationChanged, mais je n'y parviens pas, 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
    22
    23
    24
    25
    26
    27
    28
     
    // Objet dont j'ai besoin et que j'éssaye aussi de passer dans le LocationListener sans y parvenir
    JSONObject object = new JSONObject();  
    object.put("server_id", server_id);
    object.put("action", "map");
    object.put("test", "variable test pour voir si l'objet est bien passe");
    LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
     
    // Si on ne peut pas avoir la position instantanément
    // car le gps doit se lancer, on attend, on enverra la reponse plus tard
    / On doit creer un thread, il me semble, meme si ca ne me facilite pas les choses car le reste de mon code à besoin de ces données pour continuer.
    // Je prefererais que ca freeze (avec à la limite une durée maximale, si jamais le gps est pas capable de donné quoi que ce soit au bout d'une minute), cette fonction est utilisé par un service cela ne se verrais pas
    if(location == null) {
       	// Sinon on fera une requete spéciale plus tard
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {
    		@Override
    		public void onLocationChanged(Location location) {
    			Log.d("Bipack", "Bipack - GEOLOCATION CHANGE !");
    			Log.d("Bipack", "Bipack - OBJECT TEST: "+ object.getString("test"));
    			object.put("lat", location.getLatitude());
    			object.put("lng", location.getLongitude());
    		}
    	});
    	return;
    }
    object.put("lat", location.getLatitude());
    object.put("lng", location.getLongitude());

    j'ai tenté ceci, sans succès :
    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
     
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener(object) {
    	private JSONObject object;
     
    	// j'ai éssaye ceci pour passer mon objet en parametre
    	public void LocationListener(JSONObject object) {
    		this.object = object;
    	}
     
    	@Override
    	public void onLocationChanged(Location location) {
    		Log.d("Bipack", "Bipack - GEOLOCATION CHANGE !");
    		Log.d("Bipack", "Bipack - OBJECT TEST: "+ object.getString("test"));
    		object.put("lat", location.getLatitude());
    		object.put("lng", location.getLongitude());
    	}
    });

    Merci d'avance pour vos réponses,
    Sinon, java veux m'obliger à rajouter dans la fonction new Internationaliste(), ceci, sinon il me met des erreurs (mais je ne souhaite rien mettre dans ces fonction, ça alourdi mon code, pourquoi me met-il ça ?
    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
     
    @Override
    public void onProviderDisabled(String provider) {
    	// TODO Auto-generated method stub
    }
     
    @Override
    public void onProviderEnabled(String provider) {
    	// TODO Auto-generated method stub
    }
     
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    	// TODO Auto-generated method stub
    }

    Merci d'avance pour vos réponses ! =D
    Pierre.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Heudebert Voir le message
    j'ai tenté ceci, sans succès :
    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
     
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener(object) {
    	private JSONObject object;
     
    	// j'ai éssaye ceci pour passer mon objet en parametre
    	public void LocationListener(JSONObject object) {
    		this.object = object;
    	}
     
    	@Override
    	public void onLocationChanged(Location location) {
    		Log.d("Bipack", "Bipack - GEOLOCATION CHANGE !");
    		Log.d("Bipack", "Bipack - OBJECT TEST: "+ object.getString("test"));
    		object.put("lat", location.getLatitude());
    		object.put("lng", location.getLongitude());
    	}
    });
    Ça a l'air correct pourtant. Pourquoi dis-tu que c'est "sans succès" ?
    Le précédent code, il ne compilait pas. Mais celui-ci, il compile, non ?

    (Note : je ne suis pas programmeur Android. Mais en Java général quand on fait du multithread, on a besoin de synchroniser les lectures/écritures. Sinon, si un objet est écrit d'un côté et lu d'un autre, le lecteur risque de ne pas voir l'écriture.)

    Citation Envoyé par Heudebert Voir le message
    Sinon, java veux m'obliger à rajouter dans la fonction new Internationaliste(), ceci, sinon il me met des erreurs (mais je ne souhaite rien mettre dans ces fonction, ça alourdi mon code, pourquoi me met-il ça ?
    Difficile à dire puique tu ne nous parles pas de la classe Internationaliste. Mais je suppose que c'est une interface ou une classe abstraite, qui donc garantit que les méthodes en question existent. Si tu veux en faire une sous-classe anonyme, tu dois donc fournir explicitement ces méthodes, même si elles doivent rester vide. (Comme ça, tu exprimes clairement que tu souhaites que ces méthodes ne fassent rien, et que tu n'as pas oublié qu'une implémentation de Internationaliste doit fournir ces méthodes.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup pour ta réponse !
    Mon code ne compile pas quand j'écris de cette manière, il me met toute cette partie du code souligné rouge :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener(object)){
    	private JSONObject object;
    	public void setObject(JSONObject object) {
    		this.object = object;
    	}
     
    	@Override
    	public void onLocationChanged(Location location) {
    		Log.d("Bipack", "Bipack - GEOLOCATION CHANGE !");
    		Log.d("Bipack", "Bipack - OBJECT TEST: "+ object.getString("test"));
    		object.put("lat", location.getLatitude());
    		object.put("lng", location.getLongitude());
     
    	}
    	@Override
    	public void onProviderDisabled(String provider) {
    		// TODO Auto-generated method stub
     
    	}
    	@Override
    	public void onProviderEnabled(String provider) {
     
    	}
    	@Override
    	public void onStatusChanged(String provider, int status,
    	Bundle extras) {
    		// TODO Auto-generated method stub
     
    	}
     
    });
    c'est quand je met ca : new LocationListener(object) { } ca me souligne tout en rouge, si je met juste ca new LocationListener() { } ca marche mais ca ne me passe pas l'objet

    Merci ! =D

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Heudebert Voir le message
    Merci beaucoup pour ta réponse !
    Mon code ne compile pas quand j'écris de cette manière, il me met toute cette partie du code souligné rouge :
    Pardon, je me suis trompé de copier-coller. En effet, ce code ne compile pas non plus.

    C'est parce qu'une classe anonyme ne peut pas avoir de constructeur, or tu essaies de définir une classe anonyme, et de lui donner un constructeur du nom de sa classe mère. Ça ne passera pas.

    Deux solutions :

    - Enlever le besoin d'un constructeur. La classe anonyme devra alors accéder à la variable locale object directement. Pour ça, il faut qu'elle soit final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final JSONObject object = new JSONObject();
    - Donner un nom à cette classe au lieu d'en faire une classe anonyme.

    Créer quelque part cette classe :

    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
    class MyLocationListener extends LocationListener { // ou bien implements
    	private JSONObject object;
     
    	public MyLocationListener(JSONObject object) {
    		this.object = object;
    	}
     
    	@Override
    	public void onLocationChanged(Location location) {
    		Log.d("Bipack", "Bipack - GEOLOCATION CHANGE !");
    		Log.d("Bipack", "Bipack - OBJECT TEST: "+ object.getString("test"));
    		object.put("lat", location.getLatitude());
    		object.put("lng", location.getLongitude());
    	}
    }
    et s'en servir ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new MyLocationListener(object)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup de m'avoir répondu ! ça m'a vraiment aidé !

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

Discussions similaires

  1. acces à une variable privé dans une classe
    Par Jcpan dans le forum Débuter
    Réponses: 6
    Dernier message: 06/04/2010, 20h10
  2. [POO] Accès à une variable de la classe parent
    Par escteban dans le forum Langage
    Réponses: 5
    Dernier message: 22/05/2008, 09h26
  3. Réponses: 5
    Dernier message: 15/05/2007, 20h51
  4. Réponses: 6
    Dernier message: 20/04/2007, 15h24
  5. Acces à une variable-tableau de PHP
    Par Erwan21 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/02/2005, 13h55

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