Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre du Club
    Inscrit en
    décembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : décembre 2005
    Messages : 163
    Points : 51
    Points
    51

    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 :
    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 :
    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 Nicolas Romantzoff
    Ingénieur systèmes et réseaux
    Inscrit en
    février 2007
    Messages
    3 605
    Détails du profil
    Informations personnelles :
    Nom : Homme Nicolas Romantzoff
    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 605
    Points : 5 678
    Points
    5 678

    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
    163
    Détails du profil
    Informations forums :
    Inscription : décembre 2005
    Messages : 163
    Points : 51
    Points
    51

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •