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 :

Problème de timing Activité/Service


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut Problème de timing Activité/Service
    Bonjour,

    J'essaie d'executer à partir de mon activité une méthode définie dans un service, comme dans ce pseudocode suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ActivityA(){
    onCreate(){
      bindService();
      methodeA();
    }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ServiceA(){
     
    methodeA(){}
    }

    Le binding se fait avec succès mais si j'appelle la méthode du Service depuis l’évènement onCreate() de mon Activité je reçois un NullPointerException. Par contre si c'est dans l'évènement click() d'un bouton la méthode s'execute correctement. Ce qui m'amène à me demander si ce n'est pas un problème de timing (dans l'évènement onCreate() de l'Activité le Service n'est pas encore prêt).

    Quelqu'un pour me donner son avis ?

  2. #2
    Expert confirmé

    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
    Par défaut
    Salut ,

    Tu ne peux utiliser le service que justement celui-ci est lié (bind)

    http://developer.android.com/referen...p/Service.html

    Pour savoir si celui est lié il suffit de lancer comme tu as fait le doBindService qui celui lancera la connection avec ton service .
    Cette connection sera réussi que lorsuqe la procédure onServiceConnected sera appellé . C'est à partir de ce moment que tu pourras appelé les méthode de ton service grâce à la variable qui récupère le lien de ton service .
    Pour l'exemple ci dessous elle sera mBoundService

    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
    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();
        }
    };
     
    void doBindService() {
        // Establish a connection with the service.  We use an explicit
        // class name because we want a specific service implementation that
        // we know will be running in our own process (and thus won't be
        // supporting component replacement by other applications).
        bindService(new Intent(Binding.this, 
                LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }
     
    void doUnbindService() {
        if (mIsBound) {
            // Detach our existing connection.
            unbindService(mConnection);
            mIsBound = false;
        }
    }

  3. #3
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut
    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
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);		
    		doBindService();
                    methodeA(); // appel d'une méthode du service A
    
    	}
    
    private void initConnection() {
    		connection = new ServiceConnection() {
    			public void onServiceConnected(ComponentName className,
    					IBinder service) {
    				boundService = ((LocalBinder) service).getService();
    			}
    
    			public void onServiceDisconnected(ComponentName className) {
    				
    				boundService = null;
    			}
    		};
    	}
    
    	private void doBindService() {
    		initConnection();
    		Intent intent = new Intent(this, ServiceA.class);
    		bindService(intent, connection, Context.BIND_AUTO_CREATE);
    	}
    Le problème se trouve au niveau de l'appel de la méthode du Service A. Quand je fais l'appel dans un bouton de l'activité je n'ai aucun problème. C'est dans la méthode onCreate que je reçois un NullPointerException.

  4. #4
    Expert confirmé

    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
    Par défaut
    Le problème se trouve au niveau de l'appel de la méthode du Service A. Quand je fais l'appel dans un bouton de l'activité je n'ai aucun problème. C'est dans la méthode onCreate que je reçois un NullPointerException.
    Relis bien la page sur les services .

    Si tu as un pointeur null dans le onCreate c'est que le bind n'est peut être pas encore effectué .
    Si tu le fait déjà lors de la connexion cela ne te sert à rien de le faire dans le onCreate, je te conseille de bien relire le cycle de vie du service , cela apparaît .

    si je reprends ton code en prenant exemple sur l'exemple fourni par android pour les services ,

    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
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);		
                   	doBindService();
     
    	}
     
    private void initConnection() {
    if(boundService != null)
          boundService.methodeA(); // appel d'une méthode du service A
    }
    private ServiceConnection connection = new ServiceConnection() {
    	public void onServiceConnected(ComponentName className,
    					IBinder service) {
    		boundService = ((LocalBinder) service).getService();
                    initConnection();
     
    	}
     
    	public void onServiceDisconnected(ComponentName className) {
     
    		boundService = null;
    	}
    };
     
    private void doBindService() {
    	bindService(new Intent(this, 
                Service.class,) connection, Context.BIND_AUTO_CREATE);
    }
     
    private void doUnbindService() {
    	unbindService(connection);
    }
    PS: si tu veux aller un peu plus loin dans la compréhension des services .

    (via les startservice et stopservice)

    http://stackoverflow.com/questions/1...ity-in-android

  5. #5
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut
    Merci pour le lien.

    J'ai un peu de base sur le fonctionnement des services. Mon code est le même que celui fourni sur le site d'Android, à la seule différence que j'initie la connexion dans doBindService(). Ma question est pourquoi l'appel de la méthode du Service ne marche pas dans onCreate, même après avoir effectué le binding ?

  6. #6
    Expert confirmé

    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
    Par défaut
    Tu as la réponse dans le lien

    /**
    * Class for interacting with the main interface of the service.
    */
    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. We are communicating with our
    // service through an IDL interface, so get a client-side
    // representation of that from the raw service object.
    http://developer.android.com/referen....os.IBinder%29

    http://developer.android.com/referen...tion,%20int%29

    Pour essayer de faire rapide , le BindService lance bien le service demandé et te renvoie si le bind a été fait , tandis que le BroadcastReceiver lui te donne l'accès au service via le lien crée que tu récupère via

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((LocalBinder) service).getService();

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2014, 01h15
  2. Problème de démarrage du service MYSQL
    Par cjo dans le forum Installation
    Réponses: 5
    Dernier message: 05/09/2006, 15h00
  3. Problème de timed out
    Par benassis dans le forum Langage
    Réponses: 8
    Dernier message: 17/08/2006, 16h08
  4. [PHP-JS] problème avec time()
    Par maxtt dans le forum Langage
    Réponses: 14
    Dernier message: 31/07/2006, 04h12
  5. Problème de time-out avec un socket client.
    Par Depteam1 dans le forum MFC
    Réponses: 3
    Dernier message: 17/10/2005, 10h30

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