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 :

Activité qui récupère les variables d'un service


Sujet :

Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Géochimiste
    Inscrit en
    Août 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Géochimiste

    Informations forums :
    Inscription : Août 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Activité qui récupère les variables d'un service
    Bonjour à tous,
    je me prends la tête sur un truc, qui je suis sur est tout bête....

    Je suis en train de développer une application de tracking GPS. j'ai une activité qui permet d'avoir une interface graphique et un Service qui effectuer tous les calculs, sauvegardes de fichiers, localisation GPS, etc :

    ACTIVITE :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    public class MainActivity extends Activity implements OnClickListener
    {
     MyService myService;
     @Override
     public void onCreate(Bundle savedInstanceState)
       {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.application);
     
          //Connexion de l'activité au service MyService
          ServiceConnection myServiceConnection = new 
          ServiceConnection()
               {
                   @Override  
                   public void onServiceDisconnected(ComponentName name)
                    { 
                         myService = null;
                    } 
     
                   @Override  
                   public void onServiceConnected(ComponentName name, IBinder service)
                   { 
                         myService = ((MyService.MyActivityBinder)service).getMyService();
                   } 
               }; 
     
            //Démarrage du Service
            Intent serviceIntent = new Intent(this, MyService.class); 
            startService(serviceIntent);
     
            //Listener sur les boutons
            findViewById(R.id.bouton).setOnClickListener(this);
     
            Toast.makeText(MainActivity.this, String.valueOf(myService.VARIABLE), Toast.LENGTH_LONG).show();
       }
     
    //Action sur les boutons
    public void onClick(final View v)
    {
     
    }
    SERVICE :
    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
    33
    34
     
    public class MyService extends Service implements LocationListener
    {
            //Déclaration de la variable à récupérer à partir de l'activité
            public int VARIABLE = 10;
     
    public class MyActivityBinder extends Binder
    	{ 
    	   MyService getMyService()
    	   {  
    	      return MyService.this; 
    	   } 
    	}
     
    	private IBinder myBinder = new MyActivityBinder();
     
    	@Override  
    	public IBinder onBind(Intent intent)
    	{  
    	   return myBinder;
    	}
     
       @Override  
       public void onCreate()
       {  
          super.onCreate();
       }
     
       @Override  
     	public int onStartCommand(Intent intent, int flags, int startId) 
     	{  
     	   return START_REDELIVER_INTENT;
     	}
    }
    MANIFEST :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //entre les balises application qui contient l'activité
    <service android:name=".MyService"/>

    Mon but est de pouvoir récupérer la valeur de la variable VARIABLE qui se trouve dans la class MyService, à partir de l'activité et plus particulièrement à partir de la méthode onCreate.

    Pour cela, dans l'exemple, j'ai mis un Toast dans onCreate de mon activité, qui me renvoie cette valeur.

    Mon problème c'est que l'appli plante et je pense savoir pourquoi, mais je ne sais pas comment faire pour résoudre ce problème.

    Hypothèse : Lors du lancement de l'application, l'activité est instanciée avant le service, ce qui fait planter l'appli car il n'y a pas encore d'espace alloué à cette variable (elle n'existe pas encore).
    Pourquoi je suppose ça ? et bien parce que lorsque je mets mon toast dans la méthode onClick. Lorsque je lance l'application et que je clic sur le bouton, cela me renvoie bien la valeur de VARIABLE (à savoir 10).

    J'ai aussi essayé de récupérer la valeur de myService dans un toast et cela me renvoi null lorsque le toast est dans onCreate et une série de caractères lorsque le toast est dans onClick. Par conséquent, le service n'est effectivement pas connecté (ou instancié) lors de l'exécution de onCreate de mon activité.

    COMMENT FAIRE POUR RÉSOUDRE ÇA ???

    Merci d'avance.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Le service n'est disponible qu'entre les appels de onServiceConnected et onServiceDisconnected

    Donc il faut attendre ces évènements pour pouvoir faire quelque-chose...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre à l'essai
    Homme Profil pro
    Géochimiste
    Inscrit en
    Août 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Géochimiste

    Informations forums :
    Inscription : Août 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Le service n'est disponible qu'entre les appels de onServiceConnected et onServiceDisconnected

    Donc il faut attendre ces événements pour pouvoir faire quelque-chose.
    Merci pour ta réponse, mais malheureusement non car le toast se trouve bien après le lancement du service et pourtant les variables sont inaccessibles.....Les variables sont accessibles seulement lorsque tout est instancié......

    Je suis en train de chercher comment lancer le service en priorité.....

    Si quelqu'un a d'autres suggestions, je suis preneur....

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par wataiso Voir le message
    Merci pour ta réponse, mais malheureusement non car le toast se trouve bien après le lancement du service et pourtant les variables sont inaccessibles
    Ton Toast est après dans le code , mais c'est pas certains que onServiceConnected ai été appelé au moment ou tu lances ton toast.

    Pour être sur , fait des traces (Log.d(TAG,"message")) à chaque endroit clé, pour voir l'odre exact d'éxécution
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Homme Profil pro
    Géochimiste
    Inscrit en
    Août 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Géochimiste

    Informations forums :
    Inscription : Août 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Oui tu as raison.......Merci

    J'ai trouvé un moyen de contourner le problème.....
    Si ça intéresse quelqu'un :

    Je mets un thread dans le onCreate de mon activité qui récupère les variables uniquement lorsque myService est différent de null.
    En gros on attend l'ouverture du service avant d'y piocher les variables.....ça fonctionne mais je ne sais pas si c'est très propre....

    Encore merci pour ton temps....
    @+

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je ne vois pas l’intérêt d'un thread, puisque l'activité est appelée quand le service est disponible (onServiceConnected) !

    Et le thread il attend quoi comme évènement ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Membre à l'essai
    Homme Profil pro
    Géochimiste
    Inscrit en
    Août 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Géochimiste

    Informations forums :
    Inscription : Août 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Bonjour,
    Peut être que ma façon de faire n'est pas conventionnelle ?
    Cependant, dans la configuration de mon appli, le service est lancé en dernier et donc ses variables ne sont disponible qu'après son lancement (logique). Du coup le thread de l'activité permet de lancer les méthodes de l'activité qui nécessitent l'utilisation des variables du service.
    Dans le thread, il y a une boucle de test qui tourne tant que le service n'est pas disponible (ici myService != null). Une fois la condition de sortie de la boucle vérifiée, les méthodes qui récupèrent les variables dans le service sont lancées.

    Bref ! ça fonctionne en tous cas pour mon cas.
    Peut-être qu'il existe d'autres façons de faire ? Mais pour le moment je me contenterais de ça puisque ça fonctionne.

    Merci...

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par wataiso Voir le message
    Bref ! ça fonctionne en tous cas pour mon cas.
    Si j'ai bien compris tu fais un thread genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (myService == null) ;
    Si c'est le cas:
    1. C'est absolument inutile parceque tu RECOIS l'évenement que myService n'est plus null...
    2. Non ça ne fonctionne pas... Le code va prendre 100% du CPU disponible, donc ralentir le lancement du service, et l'application risque de se faire tuer par un watchdog un peu violent.
    3. Le thread ne change rien... toutes les variables que le thread va changer il va falloir notifier l'activité qu'elles ont changé... donc de toute manière envoyer un évenement à l'activité !
    Peut-être qu'il existe d'autres façons de faire ? Mais pour le moment je me contenterais de ça puisque ça fonctionne.
    On pousse la saleté sous la moquette ?

    Pour le coup du thread machin chose... je m'explique:

    Ce que tu fais (pseudo-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
     
    Activity.onCreate
    {
         mServiceConnection = [
            onConnected() { myService = ...; }
            onDisconnected() { myService = null; }
         ]
     
         startService(xxx);
     
         new Thread() {
             public void run() { while (!myService) ;   CODE-UTILISANT-LE-SERVICE }
         }.run();
    }
    Ce que tu dois faire (pseudo-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
     
    Activity.onCreate
    {
         mServiceConnection = [
            onConnected() { myService = ...; Activity.this.onServiceAvailable(); }
            onDisconnected() { myService = null; }
         ]
     
         startService(xxx);
    }
    Activity.onServiceAvailable()
    {
        CODE-UTILISANT-LE-SERVICE
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Membre à l'essai
    Homme Profil pro
    Géochimiste
    Inscrit en
    Août 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Géochimiste

    Informations forums :
    Inscription : Août 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Si c'est le cas:
    1. C'est absolument inutile parceque tu RECOIS l'évenement que myService n'est plus null...
    oui c'est exactement ce que je veux faire. Je veux savoir quand le myService n'est plus null afin de lancer juste après les méthodes qui planteraient si myService était null.....

    Le code va prendre 100% du CPU disponible, donc ralentir le lancement du service, et l'application risque de se faire tuer par un watchdog un peu violent.
    C'est pas faux, il faut que j'améliore ça, peut être avec un sleep de quelques ms dans la boucle afin de réduire la cadence de vérification de myService. ça me semble être du bricolage quand même....

    Ceci dit l'application ne plante pas au démarrage et le temps d'ouverture est très satisfaisant.
    Le thread que j'ai mis n'ai pas implémenté comme ça.

    Dans la méthode onCreate() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    thread th = new thread();
    th.execute();
    qui appel la class interne thread() :
    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
     
    class thread extends AsyncTask<Void, String, Void>
    	   	{        	
    				@Override
    	   		protected Void doInBackground(Void... inutilise)
    	   		{ 
    				int action = 0;
                                    //boucle de vérification
    	   			while(action == 0)
    	   			{
    	   				if(!String.valueOf(myService).equals("null"))
    	   				{
    	   					action = 1;
    	   				}
    	   			}
    	   			return(null);
    	   		}
    	   		@Override
    	   		protected void onProgressUpdate(String... item)
    	   		{
     
    	   		}
     
    	   		//Lorsque le thread se termine (à la sortie de la boucle)
    				@Override
    	   		protected void onPostExecute(Void inutilise)
    	   		{
    				//ICI J’EXÉCUTE LES MÉTHODES QUI UTILISENT LES VARIABLES DU SERVICE
    	   		}
    	   	}
    On pousse la saleté sous la moquette ?


    Par contre ton truc d'utiliser la méthode onServiceAvailable() me plait beaucoup.....J'ai fait quelques tests et j'ai un message d'erreur (The method onServiceAvailable() is undefined for the type Activity), mais je pense que c'est une bonne piste.

    Je vais creuser ça.....
    Merci pour ta réponse.

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Non mais c'est le nom de ton activité....

    MyActivity.this.onServiceAvailable()
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    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,

    Je te conseille de regarder le tutoriel du site officiel sur les Services :
    http://developer.android.com/referen...p/Service.html

    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
    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            // This is called when the connection with the service has been
            // established, giving us the service object we can use to
            // interact with the service.  Because we have bound to a explicit
            // service that we know is running in our own process, we can
            // cast its IBinder to a concrete class and directly access it.
            mBoundService = ((LocalService.LocalBinder)service).getService();
     
            // Tell the user about this for our demo.
            Toast.makeText(Binding.this, R.string.local_service_connected,
                    Toast.LENGTH_SHORT).show();
        }
     
        public void onServiceDisconnected(ComponentName className) {
            // This is called when the connection with the service has been
            // unexpectedly disconnected -- that is, its process crashed.
            // Because it is running in our same process, we should never
            // see this happen.
            mBoundService = null;
            Toast.makeText(Binding.this, R.string.local_service_disconnected,
                    Toast.LENGTH_SHORT).show();
        }
    };
    Ainsi que ce tutoriel :
    http://blog.developpez.com/android23...ion_de_service

    Edit :
    L'async Task que tu utilises ne te sers à rien comme te le signale nicroman. Tu as déjà tout à ta disposition pour connaître l'état de ton service .
    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.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Géochimiste
    Inscrit en
    Août 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Géochimiste

    Informations forums :
    Inscription : Août 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Merci pour vos réponses.....ça fonctionne !!!

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

Discussions similaires

  1. Macro qui récupère les contrôles d'une page
    Par nitrous007 dans le forum ASP.NET
    Réponses: 15
    Dernier message: 22/05/2007, 10h46
  2. Réponses: 2
    Dernier message: 31/05/2006, 09h58
  3. Requête qui récupère les droits d'un utilisateur
    Par peck dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 20/04/2006, 09h40
  4. Construire un formulaire qui ecrase les variables hidden
    Par Battosaiii dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 14/04/2006, 11h58
  5. [VS2005]Destructeur qui remet les variables à 0
    Par NicolasJolet dans le forum MFC
    Réponses: 8
    Dernier message: 27/03/2006, 13h50

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