p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre du Club
    Inscrit en
    décembre 2005
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : décembre 2005
    Messages : 168
    Points : 55
    Points
    55

    Par défaut Comment 'binder' un service de manière synchrone ?

    Bonjour,

    J'ai le code suivant mais il bloque et ne passe même pas par la méthode onServiceConnected().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            @Override
            public void onServiceConnected(ComponentName className, IBinder service) {
                sgsBinder = (SGS.SGSBinder) service;
     
                Log.e("binding", "binding ok");
     
                synchronized (bindingLock) {
                    bindingLock.notify();
                }
     
                isSGSBound = true;
            }
    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
        @Override
        public void onStart() {
            super.onStart();
     
            bindService(sgsIntent, sgsConnection, Context.BIND_AUTO_CREATE);
     
            synchronized (bindingLock) {
                Log.e("binding", "starting to wait");
     
                try {
                    bindingLock.wait();
                } catch (InterruptedException e) {
                    System.out.println("InterruptedException caught");
                }
            }
        }
    Quelqu'un saurait-il m'indiquer d'où peut venir le problème ?

    Merci d'avance pour votre aide

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    février 2007
    Messages
    3 989
    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 : 3 989
    Points : 7 047
    Points
    7 047
    Billets dans le blog
    2

    Par défaut

    D'abord, c'est très mal... si la fonction de service-bind a été implémentée ainsi c'est parcequ'il y a une raison: on n'a pas a attendre que le service soit bindé.
    De plus on ne doit jamais faire de sleep() ou wait() dans le thread UI. J'imagine que cela n'a pas été interdit pour laisser quand même deux ou trois fonctions IO disponibles, mais le but est que toutes les fonctions UI (dont onCreate) finissent aussi vite que possible.
    De toute manière, les cas que sleep()/wait()/notify() sont hyper hyper rares... a part des managers de message / worker-threads / IO....

    Maintenant l'explication (à mon avis la plus plausible):
    La méthode qui va binder le service va envoyer un Intent.
    Cet Intent ne sera utilisé qu'au retour de la fonction onCreate() (même process pour le service)
    Même si il était utilisé immédiatement (process différent), le message envoyé en réponse ne sera processé par la pile de message *que* si le message "create" (appel de la fonction onCreate) a fini d'être processé...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre du Club
    Inscrit en
    décembre 2005
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : décembre 2005
    Messages : 168
    Points : 55
    Points
    55

    Par défaut

    nicroman : merci pour ta réponse

    J'ai encore réfléchi au problème et en fait il faut utiliser les méthodes de la connection afin d'assurer que le binding soit effectif.

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

Discussions similaires

  1. Comment supprimer un service sous win XP?
    Par callo dans le forum Windows XP
    Réponses: 12
    Dernier message: 28/11/2011, 14h33
  2. Comment binder un service avec plusieurs activités ?
    Par Spredzy dans le forum Android
    Réponses: 5
    Dernier message: 18/10/2010, 15h47
  3. comment lancer un Service ?
    Par beastman007 dans le forum Delphi
    Réponses: 4
    Dernier message: 15/12/2006, 10h30
  4. Lire sur un port série de manière synchrone ?
    Par Hokagge dans le forum MFC
    Réponses: 26
    Dernier message: 09/06/2005, 12h16
  5. [WinService][C#] Comment déployer un service windows ?
    Par sokette dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/04/2005, 16h38

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